ホームページ >バックエンド開発 >Golang >Golangでスライスする方法

Golangでスライスする方法

WBOY
WBOYオリジナル
2023-05-21 20:34:351565ブラウズ

Golang は、効率的で強力に型指定された同時実行安全なプログラミング言語であり、その優れたパフォーマンスと使いやすさにより、開発者の間でますます好まれています。スライスは Golang の重要なデータ構造の 1 つです。必要に応じて長さを動的に増減できる動的配列で、Golangでよく使われるデータ構造の一つです、この記事ではGolangのスライスの使い方を詳しく紹介します。

1. スライスの定義

Golang では、make() 関数を使用してスライスを作成します。make() 関数は次のように使用します:

slice1 := make( []T, len, cap)

このうち、T はスライス内の要素のタイプを指し、len はスライスの長さを指し、cap はスライスの容量を指します。これは、スライスの基礎となる配列の長さです。

たとえば、長さ 3、容量 5 の int 型スライスを定義します。コードは次のとおりです。

slice1 := make([]int, 3, 5)

上記のコードは、3 つの整数要素を含むスライスを作成します。基になる配列の長さは 5 です。

2. スライス操作

2.1 スライス トラバーサル

Golang では、for ループと range キーワードを使用してスライス トラバーサルを実装できます。

1. for ループの使用

for ループを使用してスライスを走査する場合、len() 関数を使用してスライスの長さを取得し、インデックスを使用して各スライスにアクセスできます。要素。たとえば、1 ~ 5 を含む int 型のスライスを定義する場合、コードは次のようになります。

slice1 := []int{1, 2, 3, 4, 5}
for i := 0 ; i < ; len(slice1); i {

fmt.Println(slice1[i])

}

上記のコードは、スライススライス 1 の各要素を出力します。

2. range キーワードを使用する

range キーワードを使用して、スライスをより簡潔に走査します。たとえば、上記のスライススライス 1 の場合、次のコードを使用してトラバースできます:

slice1 := []int{1, 2, 3, 4, 5}
forindex, item := range slide1 {

fmt.Printf("Index: %d, Value: %d

",index,item)
}

このコードは、スライス内の各要素のインデックスと値を出力します。

2.2スライス

スライスはデータを動的に保存でき、append() 関数を使用して要素をスライスに追加できます。

たとえば、1 ~ 3 を含む int 型のスライスを定義し、

slice1 := []int{1, 2, 3}

次に、2 つの要素 4 と 5 をスライスに追加します。これを実現するには、() 関数を使用します。例:

slice1 = append(slice1, 4, 5)

要素をスライスに追加するとき、基になる要素の容量が配列が不十分な場合、より大きな基になる配列が再割り当てされ、元の要素が新しい基になる配列にコピーされるため、スライスの拡張に注意する必要があります。一般的に、頻繁な拡張を避けるために、事前に設定できますスライスの基礎となる配列の長さ

2.3 スライスのインターセプト

要素を追加することに加えて、スライスをインターセプトして新しいスライスに変えることもできます。スライスはスライス演算子 [x:y] を使用します。ここで、x はインターセプトの開始位置 (0 からカウントが開始されます)、y はインターセプトの終了位置です。

たとえば、int 型のスライスを定義します。 1 ~ 5 を含むコードは次のとおりです。

slice1 := []int{1 , 2, 3, 4, 5}

スライスの最初の 3 要素をインターセプトするには、次のコードを使用できます:

slice2 :=スライス1[0:3]

上記のコードは、スライスslice1の最初の3つの要素を含むスライスslice2を返します。 #2.4 スライスのコピー

Golang の copy() 関数を使用してスライスをコピーします。例は次のとおりです。

slice1 := []int{1, 2 , 3}

slice2 := make([]int, len(slice1))

copy(slice2 , slide1)
fmt.Println(slice2)

上記のコードは、スライス 1 と同じ長さのスライス 2 をスライスし、スライス 1 からスライス 2 に要素をコピーします。

3. スライス拡張の問題

要素を追加するとき、スライスの基になる配列の容量が不十分なため、この時点で拡張操作が行われます。スライス拡張には、メモリを再割り当てし、元の要素を新しい基になる配列にコピーする必要があり、これは時間のかかるプロセスです。したがって、スライスを設計するときは、スライスの容量を考慮する必要があります。

Golang では、cap() 関数を使用してスライスの容量を取得できます。スライスの容量がいっぱいの場合は、基になる配列の長さの 2 倍になるようにメモリを再割り当てする必要があります。

たとえば、長さ 2、容量 3 の int 型スライスを定義します。コードは次のとおりです。

slice1 := make([]int, 2, 3)

次に、スライスに 3 つの要素を追加します。これは次の方法で実現できます:

for i := 3; i

slice1 = append(slice1, i)
fmt.Println("Len:", len(slice1), ", Cap:", cap(slice1))

}

上記のコードは、追加された各要素の後にスライスの長さと容量を出力します。

拡張操作により、スライスの基になる配列アドレスが変更される可能性があることに注意してください。そのため、元のスライスへのポインタを関数のパラメータとして使用することを避ける必要があります。これにより、潜在的な問題が発生する可能性があります。問題。

4. スライス使用のヒント

Golang プログラムを設計するとき、スライスは非常に一般的に使用されるデータ構造です。使用上のヒントをいくつか紹介します:

  • ループ内でスライスを使用する場合、最初にループの外でスライスに値を割り当てることができます。これにより、各反復でスライスにメモリを再割り当てする必要がなくなり、メモリのオーバーヘッドが軽減されます。
  • スライスを関数のパラメータとして使用する場合、ポインタ型として宣言できるため、関数呼び出し時にスライス全体をコピーする必要がなくなり、メモリ消費量を削減できます。
  • Golang では、スライスは append() 関数を使用して要素を追加できますが、要素を削除する必要がある場合は、スライスのコピーおよびインターセプト操作を使用する必要があります。

5. 概要

Golang のスライスは、要素を動的に保存し、自動的に展開できる非常に一般的に使用されるデータ構造です。スライスを使用する場合は、頻繁な拡張操作を避けるために、基になる配列の容量に注意する必要があります。

この記事ではスライスの定義、操作、活用スキルを紹介しますので、Golang開発者の参考になれば幸いです。

以上がGolangでスライスする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。