スライスに対する append() の動作を理解する
スライスをポインターとして初期想定しているにもかかわらず、提供されたコードは、追加が() 操作は、元のスライスに直接影響しません。これは、Go ではスライスを含め、すべてが値によって渡されるためです。したがって、スライスを関数に渡すか、新しい変数に割り当てるときは、スライス ヘッダーのコピーを渡すだけです。
スライス ヘッダーには、スライスの長さ、その容量、そして基礎となる配列へのポインタ。 append() 操作がスライスに対して実行されると、新しい要素を収容するために必要に応じて新しい配列が割り当てられます。次に、スライス ヘッダーが新しい配列を指すように更新され、新しい要素がコピーされます。この新しいスライス ヘッダーは、append() 呼び出しの結果として返されます。
コード例では、append() 操作の戻り値をスライス 1 変数に割り当てます。これは、slice1 がスライスとは異なる配列を指すことを意味します。スライス 1 の要素に加えられた変更はスライスには反映されず、その逆も同様です。
スライスとスライス 1 の両方が同じ配列を参照する動作を実現するには、スライスへのポインターを使用する必要があります。スライス自体の代わりに。例:
func main() { slice := make([]int, 10, 10) slice[0] = 0 slice[1] = 1 slicePtr := &slice slice1 := *slicePtr slice1[0] = 10000 fmt.Println(slice) *slicePtr = append(*slicePtr, 100) (*slicePtr)[0] = 20000 fmt.Println(slice) }
この例では、slice とスライス 1 の両方が同じ基になる配列を指しているため、一方に加えられた変更はもう一方にも表示されます。
以上がappend() は Go のスライスにどのように影響しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。