2016-11-01 14 views
8
var cache = struct { 
    sync.Mutex 
    mapping map[string]string 
} { 
    mapping: make(map[string]string), 
} 

これはフィールドsync.Mutexが埋め込まれた構造体のように見えますが、第2セットの中括弧の周りに頭を当てることはできません。コンパイルして実行しますが、何が起きていますか?なぜ、make命令のラベルが意味を持つのですか(カンマ)ですか?あなたの例では、あなたがCacheの型を宣言し、代わりに匿名構造体を持っていない場合を除きこのGolang構造体の2番目の括弧は何ですか?

type Cache struct { 
    sync.Mutex 
    mapping map[string]string 
} 

cache := Cache{ 
    mapping: make(map[string]string), 
} 

:おかげで...あなたが持っている

答えて

10

例は同等です。私Cache型に反対するとして、あなたの例では、タイプがそう

cache := Cache{ 
    mapping: make(map[string]string), 
} 

一部として括弧の第二の対を考える全体

struct { 
    sync.Mutex 
    mapping map[string]string 
} 

です。

makeは、Cのcalloc()と同様に機能する組み込み関数であり、Goの場合は0の値でデータ構造体を初期化します。特定のデータ構造体はこのように初期化する必要があります。 )は0の値で自動的に初期化されます。コンパイラの現在のcache.mappingが空のmap[string]stringであるようにフィールドが必要です。

コンマにはGoの書式設定の一部がありますが、Cache{mapping: make(map[string]string)}はすべて1行にできますが、フィールドの割り当てが開閉括弧とは異なる行にある瞬間にカンマが必要です。

+1

ニックピット:Goの値は 'calloc()'と同じように "値が0に初期化されていません"。特定の型のためにいわゆる "ゼロ値"で初期化されます。これらのゼロ値は、「下位のメモリチャンクのすべてのバイトが0」とは異なる場合があります。 – kostix

+0

@kostixはい、私たちは同じことを、違った言い方でしています。 –

-1

これは "struct literal"または "anonymous struct"と呼ばれ、実際にはGoで構造体を作成する方法です。構造体の新しい型を作成するのに慣れている可能性があるため、型を少し冗長に宣言するようにします。

構造体定義全体は実際にはintまたは[]byteまたはstringのように、Goの型です。ちょうどあなたが行うことができますよう:

type NewType int 
var a NewType = 5 // a is a NewType (which is based on an int) 

か:

// a is type NewType (which is a struct{}). 
type NewType struct{ 
    A string 
} 
a := NewType{ 
    A: "test string", 
} 

// a is type struct{A string} 
a := struct{ 
    A string 
}{ 
    A: "test string", 
} 

a := 5 // a is an int 

との両方がint型のように見えるの異なる種類があり、あなたはまた、構造体と同じことを行うことができますタイプ名(NewType)は、構造体そのものの型(struct{A string})に置き換えられました。比較や代入の目的で同じ型(エイリアス)ではありませんが、同じセマンティクスを共有していることに注意してください。

+1

これは最初の答えが言うのと同じ正確なものですが、なぜこれを投稿する必要がありましたか? –

+0

私は別の方法でそれを説明すると思っていたので(簡単なintと同様の単純な型と比較することで、人々が直感的に理解しやすい)、人々を助けるかもしれません。 StackExchangeサイトで複数の同様の答えを持つことは間違いありませんが、実際は奨励されています。 –

関連する問題