Go言語での空の構造体の使用法は何ですか?

青灯夜游
リリース: 2021-06-07 15:45:37
オリジナル
3090 人が閲覧しました

使用法: 1. マップをセットとして使用する場合、値の型を空の構造体として定義できます。これはプレースホルダーとしてのみ使用されます。チャネルはデータを送信する必要はなく、データを送信するためにのみ使用されます。タスクなどを実行するようにサブコルーチンに通知する場合、空の構造体をプレースホルダーとして使用できます; 3. 構造体にメソッドのみが含まれ、フィールドが含まれていない場合は、空の構造体を宣言してリソースを節約できます。

Go言語での空の構造体の使用法は何ですか?

このチュートリアルの動作環境: Windows 10 システム、GO 1.11.2、Dell G3 コンピューター。

1. 空の構造体はスペースを占有しますか?

Go 言語では、unsafe.Sizeof を使用して、データ型インスタンスが占有するバイト数を計算できます。 。

package main

import (
	"fmt"
	"unsafe"
)

func main() {
	fmt.Println(unsafe.Sizeof(struct{}{}))
}
ログイン後にコピー

上記の例を実行すると、次の出力が得られます:

$ go run main.go
0
ログイン後にコピー

つまり、空の構造体 struct{} インスタンスはメモリ空間を占有しません。

2. 空の構造体の役割

空の構造体はメモリ空間を占有しないため、さまざまなシナリオでプレースホルダーとして広く使用されています。 1 つはリソースを節約するため、もう 1 つは空の構造自体が強力なセマンティクスを持っているためです。つまり、ここでは値は必要なく、単なるプレースホルダーです。

2.1 Set の実装

Go 言語の標準ライブラリには Set の実装が用意されていないため、通常は代わりにマップが使用されます。実際、コレクションの場合、値ではなくマップのキーのみが必要です。 bool 型に設定してもさらに 1 バイト占有されるため、マップ内のデータが 100 万個ある場合、1MB のスペースが無駄になります。

したがって、マップをセットとして使用する場合、値の型を空の構造体として定義し、プレースホルダーとしてのみ使用できます。

type Set map[string]struct{}

func (s Set) Has(key string) bool {
	_, ok := s[key]
	return ok
}

func (s Set) Add(key string) {
	s[key] = struct{}{}
}

func (s Set) Delete(key string) {
	delete(s, key)
}

func main() {
	s := make(Set)
	s.Add("Tom")
	s.Add("Sam")
	fmt.Println(s.Has("Tom"))
	fmt.Println(s.Has("Jack"))
}
ログイン後にコピー

2.2 データを送信しないチャネル

func worker(ch chan struct{}) {
	<-ch
	fmt.Println("do something")
	close(ch)
}

func main() {
	ch := make(chan struct{})
	go worker(ch)
	ch <- struct{}{}
}
ログイン後にコピー

チャネルを使用する場合、データを送信する必要がない場合があります。サブウーファーに通知するためにのみ使用されます。 -coroutine (ゴルーチン) タスクを実行するか、単にコルーチンの同時実行を制御します。この場合、空の構造体をプレースホルダーとして使用するのが非常に適しています。

2.3 メソッドのみを含む構造

type Door struct{}

func (d Door) Open() {
	fmt.Println("Open the door")
}

func (d Door) Close() {
	fmt.Println("Close the door")
}
ログイン後にコピー

シナリオによっては、構造にメソッドのみが含まれ、フィールドが含まれない場合があります。たとえば、上記の例では Door ですが、この場合、Door は実際には任意のデータ構造に置き換えることができます。例:

type Door int
type Door bool
ログイン後にコピー

int であっても bool であっても、余分なメモリが無駄になるため、この場合は空の構造体を宣言するのが最も適切です。

推奨学習: Golang チュートリアル

以上がGo言語での空の構造体の使用法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート