%
後の [i]
でオペランドを指定して print できる
foo := "aaa"
bar := "bbb"
fmt.Printf("%s %[2]s %[1]s", foo, bar) // aaa bbb aaa
配列でインデックスの指定ができる
foo := [...]string{0: "aaa", 1: "bbb", 2: "ccc"}
fmt.Println(foo) // [aaa bbb ccc]
const (
sun = iota
mon
tue
)
bar := [...]string{sun: "xxx", mon: "yyy", tue: "zzz"}
fmt.Println(bar) // [xxx yyy zzz]
baz := [...]int{9: 3}
fmt.Println(baz) // [0 0 0 0 0 0 0 0 0 3]
ポインタを渡して呼び出し元を変更
// 関数は元の値のコピーを受け取るため、元の値は変更されない
func nonzero(x [5]int) {
for i := range x {
x[i] = 0
}
}
// ポインタ渡しで元の値を変更
func zero(x *[5]int) {
for i := range x {
x[i] = 0
}
}
func zero2(x *[5]int) {
*x = [5]int{}
}
func main() {
foo := [5]int{1, 2, 3, 4, 5}
fmt.Println(foo) // [1 2 3 4 5]
nonzero(foo)
fmt.Println(foo) // [1 2 3 4 5]
zero(&foo)
fmt.Println(foo) // [0 0 0 0 0]
bar := [5]int{1, 2, 3, 4, 5}
fmt.Println(bar) // [1 2 3 4 5]
zero2(&bar)
fmt.Println(bar) // [0 0 0 0 0]
}
スライスの拡張
number := [...]int{1: 1, 2: 2, 3: 3, 4: 4, 5: 5}
fmt.Println(number) // [0 1 2 3 4 5]
s := number[2:4]
fmt.Println(s) // [2 3]
fmt.Println(len(s)) // 2
// cap は、スライスの開始位置から基底配列の終わりまでの要素数
fmt.Println(cap(s)) // 4
// スライスの拡張. cap 範囲内であれば、len を超えてスライス作成可能(参照型なので)
fmt.Println(s[:4]) // [2 3 4 5]
スライスが空であるかを検査する場合
// OK
len(s) == 0
// NG
s == nil
スライスのコピー
x := []int{0, 1}
y := []int{5, 6, 7, 8, 9}
z := []int{2, 3}
copy(x, y)
fmt.Println(x) // [5 6]
fmt.Println(y) // [5 6 7 8 9]
copy(y, z)
fmt.Println(y) // [2 3 7 8 9]
fmt.Println(z) // [2 3]
a := []int{5, 6, 7, 8, 9}
copy(a[2:], a[3:])
fmt.Println(a) // [5 6 8 9 9]
マップの存在確認
m := map[string]int{"a": 1, "b": 2, "c": 3}
xv, xok := m["xxx"]
fmt.Println(xv) // 0
fmt.Println(xok) // false
av, aok := m["a"]
fmt.Println(av) // 1
fmt.Println(aok) // true