go 勉強中メモ

More than 1 year has passed since last update.


% 後の [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