ホームページ  >  記事  >  バックエンド開発  >  golangスライスをコピーする方法

golangスライスをコピーする方法

(*-*)浩
(*-*)浩オリジナル
2019-12-17 11:24:173457ブラウズ

golangスライスをコピーする方法

#Golang のスライスは、基になる配列を指すポインタ構造です。

この構造体には 3 つの属性があります。1. 配列へのポインター、2.len: スライス内の要素の数、3.cap: スライスが占有するメモリの量。

これら 3 つの属性を深く理解することによってのみ、スライスを使用する際の間違いを避けることができます。 (推奨学習: go)

変数と共有を正しく理解する

複数のスライスで基礎となるデータと参照配列を共有できる 一部の間隔は重複する場合があります

上記は golang 聖書からの一文です。この文章を深く理解することは、スケジュールプログラミングにおいて非常に有意義です。

共有データが他の変数によって変更される場合

func f1()  {
    a1 := []int{1,2,3,4,5,6}
    a2 := a1
    a3 := a1[1:3]
    a1[1] = 999
    
    fmt.Println("a1=",a1,"a2=",a2,"a3=",a3)
}

実行結果

a1= [1 999 3 4 5 6] a2= [1 999 3 4 5 6] a3= [999 3]
Process finished with exit code 0

データ共有が明確に確認できます。この時点で a1 が変更され、両方の変数が変更されます。

いつ変更されなくなるのか

func f2()  {
    a1 := []int{1,2,3,4,5,6}
    a2 := a1
    a3 := a1[1:3]
    a2 = append(a2,888)
    a1[1] = 999
    fmt.Println("a1=",a1,"a2=",a2,"a3=",a3)
}

実行結果

a1= [1 999 3 4 5 6] a2= [1 2 3 4 5 6 888] a3= [999 3]
Process finished with exit code 0

a1は変更されていますが、a2は変更されていません。 append 関数はメモリの再割り当てに直面することがわかっています。したがって、a2 が追加されると、メモリ領域が再適用され、元の配列がコピーされ、新しい値が追加されます。つまり、追加操作が発生すると、a2 は a1 とメモリを共有しなくなります。

スライスをコピーするときに、同時に配列を指す複数の変数に直面する場合は、データ共有とメモリの再割り当てを考慮する必要があります。

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

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