問題の説明:
次の Go コードを考えてみましょう:
func main() { slice := make([]int, 10, 10) slice[0] = 0 slice[1] = 1 slice1 := slice slice1[0] = 10000 fmt.Println(slice) slice1 = append(slice1, 100) slice1[0] = 20000 fmt.Println(slice) }
最初の出力は期待どおりです。slice とslice1 の両方が、同じ価値観。ただし、slice1 に対する追加操作の後、slice の値は変更されません。スライスがポインタであると仮定すると、この動作は直観に反しているように見えます。
説明:
append 関数は、slice1 を変更しません。 Go はすべての値を値渡しするため、slice1 はスライスのコピーを受け取ります。元の配列がその容量に達したため、追加操作により新しい配列が作成されます。次に、古い配列の内容を新しい配列にコピーし、新しい配列を指す新しいスライス ヘッダーを返します。
戻り値をスライス 1 に割り当てると、スライス 1 が変更されます。ただし、スライスは元の配列を指す別の変数であるため、影響を受けません。したがって、追加操作後にスライス 1 またはスライスの要素に加えられた変更は、他の要素には反映されません。
要約すると、Go のスライスは値渡しであり、追加では新しいスライスを作成します。必要に応じて基礎となる配列を作成します。これは、1 つのスライスに加えられた変更は、元の配列を指す他のスライスには反映されないことを意味します。
以上がGo スライスに追加しても、同じ基礎となる配列を指す他のスライスに影響を与えないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。