Skip to content

Instantly share code, notes, and snippets.

@tokubass
Created June 8, 2016 09:58
Show Gist options
  • Save tokubass/36e415bfe19ae451636c0da168dd2cad to your computer and use it in GitHub Desktop.
Save tokubass/36e415bfe19ae451636c0da168dd2cad to your computer and use it in GitHub Desktop.
The Go Programming Language - ch4 struct

4.4 Structs

  • 名前付きの値の集合を表す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 {}は空の構造体
  • sizeが0、何の情報ももってない
  • mapでset型を表現したように、何かしら値を代入して、bool値の変わりにすることがある。この値に利用すると、メモリなど容量が抑えられる。
 seen := make(map[string]struct{}) // set of strings
 if _, ok := seen[s]; !ok {
       seen[s] = struct{}{} // trueの代わり
       ...

4.4.1 Struct Literals

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}

4.4.2 Comparing Structs

  • すべてのFieldが比較可能ならstructは比較可能
  • ==,!=以外にもmapのkeyに指定できる。
type address struct {
  hostname string
  post     int
}
hits := make(map[address]int)
hits[address{"glang", 443}]++

4.4.3 Struct Embedding and Anonymous Fields

w.X = 8 //ok
w.circle.X = 8 //ng
  • 構造体以外のものもアノニマスにできるが、何が嬉しい?
    • 答えはmethodの組み込み
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment