2016-05-19 8 views
0

違いは何ですか? map[T]boolmap[T]struct{}に最適化されていますか? Goのベストプラクティスはどれですか?map [T] struct {}とgolangの[T] boolをマップします

おそらくmap[T]struct{}を使用する最もよい理由は、「値がfalseの場合はどういう意味ですか?」という質問に答える必要がないことでしょうか? 「ゴープログラミング言語」から

+0

ただ一つの状態を持つ 'struct {}'に2つの状態(真偽)を持つ 'bool'を"最適化 "できますか? – Volker

+0

YAR、それを最適化することはできません。 – zsounder

答えて

3

フィールドのない構造体のタイプは struct{}を書かれた、空の構造体と呼ばれています。それはサイズがゼロであり、情報を持ちませんが、それにもかかわらず が役に立つかもしれません。一部のGoプログラマは、 キーのみが重要であることを強調するために、 値タイプのマップをboolの代わりに使用していますが、スペース節約は重要でなく、構文は より厄介です。

あなたはあなただけ言うことができるので、少し進歩して、「設定」に存在するかboolテストを使用する場合:

if mySet["something"] { 
    /* .. */ 
} 
+0

正直なところ、あなたのセットの大きさにも依存します。また、 'if _、ok:= mySet [" x "]; ok {} 'は入力するのが難しくありません。 – OneOfOne

+0

@OneOfOneあなたはもちろんそうです。いつものように、これは固くて速いルールではありません。 – cnicutar

0

空の構造体は、他のどのような構造体型です。普通の構造体に慣れているすべてのプロパティは空の構造体に等しく適用されます。 structs{}の配列を宣言することはできますが、もちろんそれらは記憶域を消費しません。

var x [100]struct{} 
fmt.Println(unsafe.Sizeof(x)) // prints 0 

空の構造体がデータを保持しない場合、2つのstruct{}値が異なるかどうかを決定することは不可能です。

上記の文を考慮すると、メソッド受信者として使用できることを意味します。

type S struct{} 

func (s *S) addr() { fmt.Printf("%p\n", s) } 

func main() { 
     var a, b S 
     a.addr() // 0x1beeb0 
     b.addr() // 0x1beeb0 
} 
0

メモリ要件に違いがあります。ボンネットの下では、空の構造体はポインタではなく、メモリを節約するための特別な値です。

関連する問題