使用法: 1. マップをセットとして使用する場合、値の型を空の構造体として定義できます。これはプレースホルダーとしてのみ使用されます。チャネルはデータを送信する必要はなく、データを送信するためにのみ使用されます。タスクなどを実行するようにサブコルーチンに通知する場合、空の構造体をプレースホルダーとして使用できます; 3. 構造体にメソッドのみが含まれ、フィールドが含まれていない場合は、空の構造体を宣言してリソースを節約できます。
このチュートリアルの動作環境: Windows 10 システム、GO 1.11.2、Dell G3 コンピューター。
Go 言語では、unsafe.Sizeof を使用して、データ型インスタンスが占有するバイト数を計算できます。 。
package main import ( "fmt" "unsafe" ) func main() { fmt.Println(unsafe.Sizeof(struct{}{})) }
上記の例を実行すると、次の出力が得られます:
$ go run main.go 0
つまり、空の構造体 struct{} インスタンスはメモリ空間を占有しません。
空の構造体はメモリ空間を占有しないため、さまざまなシナリオでプレースホルダーとして広く使用されています。 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 サイトの他の関連記事を参照してください。