A Tour of Go vol.5 (Range / Map)
Range
スライスやマップの要素についてindexとあわせて1つずつ返す。
var pow = []int{1, 2, 4, 8, 16, 32, 64, 128} for i, v := range pow { fmt.Printf("index:%d value:%d\n", i, v) }
第一引数のindexについては"_"を使うことで破棄することもできる。
Maps
キーと値とを関連付ける(マップする)。
ゼロ値はnil
type Vertex struct { Min, Max int64 } // キーがString型 値がVertex型のマップ型 var m map[string]Vertex func main() { m = make(map[string]Vertex) m["Size Range"] = Vertex{ 40, 74, } fmt.Println(m["Size Range"]) }
初期化
var g = map[string]Vertex{ "Kids Size Range": {40, 60}, "Teens Size Range": {61, 100}, }
値の確認
elem, ok := m[key]
マップmにkeyがあれば2つ目の返却値でtrueが返ってくる。
クロージャ
クロージャーの説明が1番わかりやすかった記事
なぜクロージャ(Closure)と言うのか?
関数が自信のスコープ外から変数を参照し、変更を与える場合にその関数のことをクロージャーと見なされる。
func adder() func(int) int { sum := 0 return func(x int) int { sum += x return sum } } func main() { pos, neg := adder(), adder() for i := 0; i < 10; i++ { fmt.Println( pos(i), neg(-2*i), ) } }
上記のコードでadder関数がクロージャーである無名関数を返却している。
無名関数が格納された変数posとnegはそれぞれadder関数の持つsum変数を参照し、値を操作している。
この時"posとnegは変数sumへバインドされている"と表現する。
A Tour of GoのBasicsが完了しました!!
Next: Methods and interfaces
Last: Concurrency