#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 サイトの他の関連記事を参照してください。