Golang で配列を関数に渡して変更する
C のようなプログラミング言語では、配列は関数に渡されるときに暗黙的に参照によって渡されます。ただし、Golang ではこの動作が異なるため、他の言語から来た人にとっては混乱する可能性があります。
違い: 配列とスライス
提供されたコード内例:
<code class="go">func main() { tab := []int{1, 2, 3} fmt.Println(tab) reverse(tab) fmt.Println(tab) } func reverse(tab []int) { for i, j := 0, len(tab)-1; i < j; i, j = i+1, j-1 { tab[i], tab[j] = tab[j], tab[i] } }</code>
配列は (参照ではなく) 値によって渡されているように見えますが、リバース関数は依然として元の配列を変更します。ここで重要なのは、Golang では、「タブ」は配列ではなく、スライスであるということです。
Go のスライス
スライスは軽量データです配列の連続したセクションを表す構造体。これらは、基になる配列へのポインター、長さ、および容量で構成されます。スライスが関数に渡されると、基礎となる配列全体ではなく、ヘッダー情報 (ポインター、長さ、容量) のみがコピーされます。
スライスの参照渡し
したがって、関数内のスライスに加えられた変更は、同じデータを指しているため、基になる配列に影響を与えます。上記の例では、reverse 関数がスライスの要素を変更し、それが元の配列タブに影響を与えます。
結論
Go の配列は次のように渡されます。値 (コピー)、スライスは参照によって渡されます (基になるデータを共有します)。 Golang の関数に配列またはスライスを渡す場合、予期しない動作を避けるために、この区別を理解することが重要です。
以上がGolang のスライスは、値によって関数に渡される場合でも、元の配列をどのように変更するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。