配列 / スライス【夏休みにGo vol.8】

こんにちは、しーたです。
今日は配列とスライスについて学んでいきます。

 

①配列

基本的に他の言語と同じです。
ただし、配列はリサイズができません。

func main() {
    var a [2]int //配列
    a[0] = 100
    a[1] = 200
    fmt.Println("a =", a)
    //a = append(a, 300) ×配列はサイズを変更できない
}

 

f:id:theta04:20200803213518p:plain

 

②スライス

スライスは、長さの決まっていない配列みたいなものです。
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)
}

↓実行結果

f:id:theta04:20200803213623p:plain

 

③スライスのmake, cap, len

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

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

です。容量を指定しなければ「容量=要素数」となります。

appendで容量が足りなくなると、自動で2倍の容量が確保されます。
これらは"len(), cap()"で確認できます。

func main() {
    n := make(int35//要素数, 容量
    fmt.Printf("n len=%d cap=%d value=%d\n"len(n), cap(n), n)
    n = append(n, 12)
    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([]int3)
    fmt.Printf("a len=%d cap=%d value=%d\n"len(a), cap(a), a)
}

↓実行結果

f:id:theta04:20200803222742p:plain

 

それでは!