Yuri’s Tech Note

技術系アウトプット

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