Go言語(golang)のSlice

※当サイトではアフィリエイト広告を利用しています

目次

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()は非ゼロです。

スライスの範囲外アクセス

スライスの範囲外にアクセスしようとすると、実行時エラーが発生します。範囲を確認せずにスライスにアクセスすると、プログラムがクラッシュする可能性があります。

スライスと関数の引数

スライスは参照型であるため、関数に渡すときは元のデータが変更される可能性があります。必要に応じて、関数内で新しいスライスを作成してコピーするか、元のデータを変更するようにする必要があります。

これらの注意点に気を付けることで、スライスを安全かつ効果的に使用することができます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

テック企業でプレイングマネージャーをしている Jun です。プログラミングの基礎をはじめ、組織やマネジメントについてブログを書いています。ハードスキル、ソフトスキルどちらも磨きたい方を対象にしています。一緒に学んで人生を楽しくしていきましょう!

目次