Go言語(golang)のSlice
Sliceの使い方を説明します。Tour of Goを参考にしています。
Go言語(golang)のSliceの使い方
Go言語のSlice(スライス)は、配列の一部分への参照を表す柔軟なデータ構造です。スライスは、可変長であり、元の配列(あるいは他のスライス)の一部分を指し示すポインタ、長さ、および容量の情報を持っています。以下に、Goのスライスに関する基本的な情報を示します。
スライス作成
// 配列からのスライスの作成
arr := [5]int{1, 2, 3, 4, 5}
slice := arr[1:4] // [2, 3, 4]
// スライスの直接作成
slice2 := []int{1, 2, 3, 4, 5}
スライス要素へアクセス
fmt.Println(slice[0]) // 2
スライスの長さと容量
fmt.Println(len(slice)) // 3 (長さ)
fmt.Println(cap(slice)) // 4 (容量)
スライスの追加と削除
// 要素の追加
slice = append(slice, 6) // [2, 3, 4, 6]
// 要素の削除
slice = append(slice[:2], slice[3:]...) // [2, 3, 6]
スライスのコピー
copySlice := make([]int, len(slice))
copy(copySlice, slice)
nilスライス
スライスが何も参照していない場合、それはnil
スライスとなります。
var nilSlice []int
範囲演算子を使用したループ
for index, value := range slice {
fmt.Printf("Index: %d, Value: %d\n", index, value)
}
スライスは、Go言語でデータ構造を扱う上で非常に重要であり、配列よりも柔軟で効率的です。配列は固定サイズであり、コピーが値渡しであるため、スライスはこれらの制約を緩和し、データを効果的かつ安全に扱うための手段を提供します。
Go言語(golang)のSliceの並び替え
func Sort(in []string) []string {
slices.Sort(in)
return in
}
いくつかの関数が用意されています。
- Sort:スライスとを並び替える
- IsSorted:スライスがソートされているか確認する
- SortFunc:指定した関数でスライスを並び替える
- SortStableFunc:指定した関数でスライスを安全に並び替える
- IsSortedFunc:指定した関数でスライスがソートされているか確認する
Go言語(golang)のSliceの注意点
スライスの参照とメモリ管理
スライスは元の配列(または他のスライス)の一部を参照するため、スライスを変更すると元のデータも変更されます。スライスが指し示すデータが他の部分でも使用されている場合、意図しない影響が発生する可能性があります。
スライスの再割り当て
append
関数などでスライスに要素を追加すると、スライスの容量が不足する場合、新しい配列が割り当てられ、元のデータがコピーされます。このとき、元のスライスが参照するデータは変わりませんが、新しいスライスが新しいデータを参照します。この動作に注意して、必要な場合は元のスライスを再割り当てするか、append
の結果を使用するようにします。
nilスライスとゼロ値
初期化されていないスライスはnil
スライスとなります。nil
スライスはどの配列も参照しておらず、要素数もゼロです。ゼロ値としてのnil
スライスと、空のスライスは区別されます。nil
スライスはlen()
とcap()
が共にゼロですが、空のスライスはlen()
はゼロであってもcap()
は非ゼロです。
スライスの範囲外アクセス
スライスの範囲外にアクセスしようとすると、実行時エラーが発生します。範囲を確認せずにスライスにアクセスすると、プログラムがクラッシュする可能性があります。
スライスと関数の引数
スライスは参照型であるため、関数に渡すときは元のデータが変更される可能性があります。必要に応じて、関数内で新しいスライスを作成してコピーするか、元のデータを変更するようにする必要があります。
これらの注意点に気を付けることで、スライスを安全かつ効果的に使用することができます。