配列 / スライス / 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) ×配列はサイズを変更できない
}

画像1


②スライス

スライスは、長さの決まっていない配列みたいなものです。
appendを使って要素の追加が可能です。もちろん、配列やスライスを入れ子構造にすることもできます。

func main() {
    var b []int = []int{1234//スライス
    fmt.Println("b =", b)           //全要素の表示
    b = append(b, 56)             //スライスはリサイズ可能
    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{012},
        []int{345},
        []int{678},
    }
    fmt.Println(matrix)
}

↓実行結果

画像2


③スライスのmake, cap, len

makeを使ってスライスを宣言することもできます。引数は「型, 要素数, 容量」

要素数(length) = 要素の数
容量(capacity) = 何要素分メモリを確保しているか

です。容量を指定しなければ「容量=要素数」となります。
appendで容量が足りなくなると、自動で2倍の容量が確保されます。
これらは"len(), cap()"で確認できます。

func main() {
    := 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)
}

↓実行結果

画像3


それでは!

いいなと思ったら応援しよう!