Go言語の配列を扱ったので、ここではスライス(Slice)についてみていきます。
このスライスの方が、配列よりも柔軟にデータを扱うことができます。
スライスの宣言
Goのスライスは配列と違って決まった長さを持ちません。
スライスの宣言は次のような形になります。
var 配列名 []型名
var 配列名 []型名 = []型名{要素a, 要素b,...}
上側は宣言のみ、下側は値を格納して宣言する形です。
どちらも配列と違って要素数を指定していません。
具体的なコードで見てみましょう。
package main
import "fmt"
func main() {
x := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println(x)
}
省略宣言の形で変数を初期化しています。
int型の値を波括弧{}で格納しています。
実行結果はこちらのとおり。
[1 2 3 4 5 6 7 8 9]
特に難しいことは無いですね。
要素へのアクセスとスライス
スライスもインデックスを指定して要素にアクセスすることが出来ます。
上のコードを使ってやってみましょう。
package main
import "fmt"
func main() {
x := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println(x)
fmt.Println(x[5])
x[1] = 200
fmt.Println(x)
}
変数に角括弧[]にインデックスを指定してアクセスして、要素を取り出します。
また、インデックスを指定して要素の値を変更することも出来ます。
実行すると次のようになります。
[1 2 3 4 5 6 7 8 9]
6
[1 200 3 4 5 6 7 8 9]
インデックスの5番目の値を出力、1番目の値を200に変更しているのが確認出来ます。
スライスは、インデックスとコロン(:)を使って、範囲を指定して取り出すことが出来ます。
package main
import "fmt"
func main() {
x := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println(x)
fmt.Println(x[2:5])
fmt.Println(x[:5])
fmt.Println(x[5:])
fmt.Println(x[:])
x = append(x, 10, 11, 12)
fmt.Println(x)
}
[]の中にスタート位置と終了位置をコロンを使って指定しています。ここでは、[2:5]です。実際の終了位置は、指定した数値のマイナス1で、他の言語で配列を扱うときと同じですね。
スタート位置を指定しない場合は[:5]のように指定し、スタート位置のみを指定する場合は[5:]のように指定します。
[:]のようにコロンだけを記述すると全てを取り出すことになります。
このあたりはPythonでも同様の処理がありますね。
apped()を使って要素を追加しています。これはGoの配列では出来なかったことですね。複数の値をまとめて追加しています。
実行結果は以下になります。
[1 2 3 4 5 6 7 8 9]
[3 4 5]
[1 2 3 4 5]
[6 7 8 9]
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9 10 11 12]
それぞれの範囲での要素が出力され、appendで要素が追加されているのが確認出来ます。
Pythonのコードで書くと…
同様の処理をPythonでやって見ましょう。
def main():
x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(x)
x[1] = 200
print(x)
print(x[2:5])
print(x[:5])
print(x[5:])
print(x[:])
x.append(10)
x.append(11)
x.append(12)
print(x)
if __name__ == "__main__":
main()
処理の違いはGoと変わりありません。
ただ、append()だけは、Pythonは複数の値をまとめて追加することは出来ません。
結果はこうなります。
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 200, 3, 4, 5, 6, 7, 8, 9]
[3, 4, 5]
[1, 200, 3, 4, 5]
[6, 7, 8, 9]
[1, 200, 3, 4, 5, 6, 7, 8, 9]
[1, 200, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
最後に
Go言語のスライス(Slice)の基本について扱いました。
配列と違って、要素数を指定せずに初期化するのがスライスです。
要素数を指定しないところから、配列よりもデータの扱いが柔軟であるのが特徴です。