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)