- 名前付きの値の集合を表すdata type.
- それぞれの値をfiledと呼ぶ。
- filedにはdotでアクセスできる。
var dilbert Employee
dilbert.Name
dilbert.Name = "foo"
// pointerを通じてアクセスもできる。
position := &dilbert.Position
*position = "Senior " + *position
構造体ポインタで宣言しても暗黙のドットアクセスができる
var employeeOfTheMonth *Emploee = &dilbert
// もしくは employeeOfTheMonth := &dilbert
employeeOfTheMonth.Position += "hoge "
(*employeeOfTheMonth).Position += "hoge "
同じ型ならまとめてかける
type Hoge struct {
Name,Address string
}
Goの通例通り、構造体名とfiled名が大文字、小文字始まりかでアクセスコントロール
type Hoge struct {
Field1 *Hoge
}
-
同じStruct名を入れ子にはできないがポインタは大丈夫
-
再帰構造が作れる。linkリストや木構造。
-
フィールドの並び順が変わると別の型とされることに注意(?)
- struct {}は空の構造体
- sizeが0、何の情報ももってない
- mapでset型を表現したように、何かしら値を代入して、bool値の変わりにすることがある。この値に利用すると、メモリなど容量が抑えられる。
seen := make(map[string]struct{}) // set of strings
if _, ok := seen[s]; !ok {
seen[s] = struct{}{} // trueの代わり
...
type Point struct { X,Y int}
p := Point{1,2} // p := Point; p.X =1; p.Y = 2; としなくていい。
//名前付きだとfieldがかけていてもok. zero valueになる。
p := Point{X:1} // Y:0
-
filedが小文字だと別packageにimportしてもexportされない。
-
関数の引数にとれる。structが大きい場合はpointerでもいい。
pp := &Point{1,2}
pp := new(Point)
*pp = Point{1,2}
- すべてのFieldが比較可能ならstructは比較可能
- ==,!=以外にもmapのkeyに指定できる。
type address struct {
hostname string
post int
}
hits := make(map[address]int)
hits[address{"glang", 443}]++
-
アノニマスフィールドにすることで、名前を省略できる。
-
structリテラルでは構造を省略できない
-
アノニマスに指定した型が小文字始まりの場合は明示的に別パッケージから呼べない
w.X = 8 //ok
w.circle.X = 8 //ng
- 構造体以外のものもアノニマスにできるが、何が嬉しい?
- 答えはmethodの組み込み