ホームページ  >  記事  >  バックエンド開発  >  Go で Slice を使用する際のメモを共有する

Go で Slice を使用する際のメモを共有する

藏色散人
藏色散人転載
2021-10-13 17:28:522286ブラウズ

この記事は、go 言語 チュートリアル コラムから、go で Slice を使用する際の注意事項を共有するために提供されたものです。

この記事では、Go でのスライスの使用について説明します。次のプログラムを見てみましょう。

package mainimport (
    "fmt"
    )func main() {
    var array [10]int
    var slice = array[5:6]
    fmt.Println("lenth of slice: ", len(slice))
    fmt.Println("capacity of slice: ", cap(slice))
    fmt.Println(&slice[0] == &array[5])}
  • このプログラムについて言いたいことは、 main 関数で定義されているということです。長さ 10 の整数配列を作成し、スライスを定義し、配列の 6 番目の要素を切り取り、最後にスライスの長さと容量を出力して、スライスの最初の要素のアドレスとスライスの 6 番目の要素のアドレスが一致するかどうかを判断します。配列は等しいです。
  • スライスの最初の要素が配列の 6 番目の要素と等しいかどうかを誰もが考えます。おそらく、このプログラムを実行してそれを証明し、以下の結果を見てください。わかりました、私はそうではありません上記のプログラム データ配列 array でスライスを作成し、配列と記憶領域を共有します スライスの開始位置は array[5]、長さは 1、容量は 5 です。 0] と array[5] は同じです。

次に、このプログラムを見て、自分で実行してみましょう。実践こそが最良の教師です。

package mainimport (
    "fmt")func AddElement(slice []int, e int) []int {
    return append(slice, e)
    }func main() {
    var slice []int
    slice = append(slice, 1, 2, 3)
    newSlice := AddElement(slice, 4)
    fmt.Println(&slice[0] == &newSlice[0])}
  • 私がこのプログラムで表現したいこと上の段落は次のとおりです。関数 AddElement() はスライスと要素を受け取り、要素をスライスに追加して、スライスを返します。 main() 関数でスライスを定義し、スライスに 3 つの要素を追加します。次に、AddElement() を呼び出してスライスに 4 番目の要素を追加し、新しいスライス newSlice を定義します。最後に、新しいスライス newSlice と古いスライスがストレージ領域を共有しているかどうかが判断されます。
  • このプログラムでは、多くの友人が追加によって古いスライスの拡張がトリガーされる可能性があると考えていると考えていますが、それについては確信がありません。 「可能」が「確実」になりました:
    1. append 関数が実行されると、スライス容量が新しい要素を格納できるかどうかが判断され、そうでない場合は、ストレージ スペースが再申請されます。そして、新しい記憶領域は元のサイズの 2 倍になります。または 1.25 倍 (元の拡張された領域のサイズによって異なります)。この例では、実際には 2 つの追加操作が実行されます。最初の領域は 4 に増加するため、2 番目の追加は再び拡張することはないため、古いスライスと新しいスライスはストレージ領域の一部を共有します。プログラムは「true」を出力します。

次に、このプログラムがどのように出力されるかを確認し続けます。それについて考えることも、プログラムを実行することもできます:

 package mainimport (
    "fmt")func main() {
    orderLen := 5
    order := make([]uint16, 2 * orderLen)
    pollorder := order[:orderLen:orderLen]
    lockorder := order[orderLen:][:orderLen:orderLen]
    fmt.Println("len(pollorder) = ", len(pollorder))
    fmt.Println("cap(pollorder) = ", cap(pollorder))
    fmt.Println("len(lockorder) = ", len(lockorder))
    fmt.Println("cap(lockorder) = ", cap(lockorder))}

上記のプログラムを実行した後、疑問が生じ、読み続けてください。プログラムは、長さ 10 のスライス順序、pollorder、lockorder をそれぞれ定義します。 order 順序スライス [start ,stop,max] 操作によってスライスが生成され、最後にプログラムは、polorder と lockorder の容量と長さをそれぞれ出力します。

    order[start,stop,max] は注文をスライスすることを意味し、新しいスライス範囲は [start, stop)、新しいスライス容量は max です。注文の長さは orderLen の 2 倍で、polorder スライスは注文の前半を指し、lockorder は注文の後半を指します。つまり、元の注文が 2 つのセグメントに分割されます。したがって、polorder とlockerorder の長さと容量は両方とも orderLen、つまり 5 になります。
  1. この記事では、Slice の使用方法について説明します。困っているパートナーのお役に立てれば幸いです。Slice の使用方法の詳細については、ディスカッションするメッセージを残してください。

以上がGo で Slice を使用する際のメモを共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。