Goには配列と似た「スライス(Slice)」というデータ構造の概念がある。要素数の指定が不要で、配列より柔軟にデータを扱うことができる。

 

スライスの宣言

var 配列名 []型名
var 配列名 []型名 = []型名{要素a, 要素b,...}

 

スライスの使用例

slice1.go

package main

import "fmt"

func main() {

    //短縮系でスライスnumを定義
    num := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}  //[1 2 3 4 5 6 7 8 9]
    fmt.Println(num)

}

 

特定の要素を取得するにはスライス名[インデックス値]となり、他の言語と変わりない。

slice2.go

package main

import "fmt"

func main() {

    num := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
    //すべての要素を出力
    fmt.Println(num)     //[1 2 3 4 5 6 7 8 9]
    
    //インデックスを指定して特定の要素を取得して出力
    fmt.Println(num[2])  //3
    
    //要素の値を変更
    num[6] = 7000
    fmt.Println(num)    //[1 2 3 4 5 6 7000 8 9]

}

 

以下は要素の範囲を指定したり、値を追加する例。

slice3.go

package main

import "fmt"

func main() {

    num := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
    //すべての要素を出力
    fmt.Println(num)            //[1 2 3 4 5 6 7 8 9]
    
    //インデックス範囲の開始・終了地点を指定
    fmt.Println(num[3:6])       //[4 5 6]
    
    //インデックスの終了地点のみ指定
    fmt.Println(num[:6])        //[1 2 3 4 5 6]
    
    //インデックスの開始地点のみ指定
    fmt.Println(num[6:])        //[7 8 9]
    
    //要素に値を追加
    num = append(num, 10, 11, 12, 100)
    fmt.Println(num)            //[1 2 3 4 5 6 7 8 9 10 11 12 100]

    //セミコロンで全要素を対象とする
    fmt.Println(num[:])         //[1 2 3 4 5 6 7 8 9 10 11 12 100]

}

 

Pythonの場合

若干順番はずれているが、以下Pythonの例。Pythonにはsliceの概念がないのでlist。かつ、要素の型宣言が省略されている。

list.py

def main():
    num = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    print(num)

    # 要素の範囲指定
    print(num[2:6])
    print(num[:6])
    print(num[6:])

    # 要素に値を追加
    num.append(10)
    num.append(11)
    num.append(12)
    num.append(100)
    print(num)
    
    # 要素の値を変更
    num[6] = 7000
    print(num[:])

if __name__ == "__main__":
    main()

 

出力結果

$ python3 list.py 
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[3, 4, 5, 6]
[1, 2, 3, 4, 5, 6]
[7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 100]
[1, 2, 3, 4, 5, 6, 7000, 8, 9, 10, 11, 12, 100]

 

ちなみにPythonではnum.append(10,11,12,100)のような記述は以下のエラーになり、NGである。このため上記のように逐一個別に指定する必要がある。これについてはGoの方がちょっと便利。

TypeError: list.append() takes exactly one argument (4 given)

 

参考
【Go入門】スライス(Slice)の基本

 

RWC2019 RWC2019 RWC2019


関連がありそうな記事