配列 / スライス / make, cap, len【夏休みにGo vol.8】
こんにちは、しーたです。
今日は配列とスライスについて学んでいきます。
①配列
基本的に他の言語と同じです。ただし、配列はリサイズができません。
func main() {
var a [2]int //配列
a[0] = 100
a[1] = 200
fmt.Println("a =", a)
//a = append(a, 300) ×配列はサイズを変更できない
}
②スライス
スライスは、長さの決まっていない配列みたいなものです。
appendを使って要素の追加が可能です。もちろん、配列やスライスを入れ子構造にすることもできます。
func main() {
var b []int = []int{1, 2, 3, 4} //スライス
fmt.Println("b =", b) //全要素の表示
b = append(b, 5, 6) //スライスはリサイズ可能
fmt.Println(b)
fmt.Println("b[2] =", b[2]) //index3の要素を表示
fmt.Println(b[2:4]) //index2-4の表示
fmt.Println(b[:4]) //index0-4の表示
fmt.Println(b[4:]) //index4-5の表示
fmt.Println(b[:]) //index0-5の表示
b[2] = 10 //要素の書き換え
fmt.Println(b)
var matrix = [][]int{ //スライス内にスライス
[]int{0, 1, 2},
[]int{3, 4, 5},
[]int{6, 7, 8},
}
fmt.Println(matrix)
}
↓実行結果
③スライスのmake, cap, len
makeを使ってスライスを宣言することもできます。引数は「型, 要素数, 容量」で
要素数(length) = 要素の数
容量(capacity) = 何要素分メモリを確保しているか
です。容量を指定しなければ「容量=要素数」となります。
appendで容量が足りなくなると、自動で2倍の容量が確保されます。
これらは"len(), cap()"で確認できます。
func main() {
n := make([]int, 3, 5) //要素数, 容量
fmt.Printf("n len=%d cap=%d value=%d\n", len(n), cap(n), n)
n = append(n, 1, 2)
fmt.Printf("n len=%d cap=%d value=%d\n", len(n), cap(n), n)
n = append(n, -1, -2) //容量が2倍確保される
fmt.Printf("n len=%d cap=%d value=%d\n", len(n), cap(n), n)
var a = make([]int, 3)
fmt.Printf("a len=%d cap=%d value=%d\n", len(a), cap(a), a)
}
↓実行結果
それでは!