More types
スライス
スライスが出てきた。スライスの概念はRustで初めて知ったけど、Goも大体同じ
- 長さと容量を別に持ってる
- スライスリテラルは
[]int{5, 4, 3, 2, 1}
の様に作る。 - スライスに要素を追加するには、
append()
を使う。容量を増やさないといけないときは、ギリギリじゃなくて余裕を持たせて(たぶん基本は倍)増やす。
構造体のスライスのリテラル
宣言と初期化をいっぺんにするのアリ。
s := []struct { i int b bool }{ {2, true}, {3, false}, {5, true}, {7, true}, {11, false}, {13, true}, }
Map
キーに対して値をもつかどうかを2つめの戻り値でチェックできる
v, ok := m["key"]
いらなければ、
v := m["key"]
でよい。v, _
で受けなくてよいのがGoのスタイルなのかな。
関数
- 関数を変数に入れる場合の型の指定はfuncを使う。
- 変数に入った関数のcallは普通に()をつける感じ。
- Goの関数はクロージャ。環境をバインドする。
func compute(fn func(float64, float64) float64) float64 { return fn(3, 4) } func main() { hypot := func(x, y float64) float64 { return math.Sqrt(x*x + y*y) } fmt.Println(hypot(5, 12)) fmt.Println(compute(hypot)) fmt.Println(compute(math.Pow)) }