Golang: 配列受け渡しの謎を解明する
この記事では、Golang での配列受け渡しにまつわる謎を詳しく掘り下げます。配列が参照によって暗黙的に渡される他の言語とは異なり、Golang のアプローチは独特です。
混乱の探索
Alan A.A. Donovan と Brian W. Kernighan は、「The Go Programming Language」の中で、Go の配列は参照によって暗黙的に渡されないことを示唆しています。ただし、次のコードを詳しく調べると、疑問が生じる可能性があります。
<code class="go">func main() { tab := []int{1, 2, 3} fmt.Println(tab) // Results in [1 2 3] reverse(tab) fmt.Println(tab) // Results in [3 2 1] } 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>
配列を参照渡ししていないにもかかわらず、reverse 関数は元の配列を変更します。この動作は C に似ているようです。
明かされた真実
重要なのは、変数タブ (メイン) とパラメーター タブ (逆) が次のとおりであることを認識することにあります。配列ではなく、基礎となる配列のスライスです。配列とは異なり、スライスは配列の一部を記述する単なるヘッダーです。スライスが渡されるとき、これらのヘッダーのみがコピーされ、同じバッキング配列を指します。
重要な違い
Go では、配列の長さはその型に固有です (例: [3]int)、実際の配列が値によって渡されることを示します。ただし、スライスは単なる記述子であり、値によって渡されますが、要素への変更はすべてのスライスで同じであるため、基礎となる配列に影響します。
追加の洞察
より深く理解するには、次のリソースを参照してください:
結論
配列を渡す Go のアプローチは次のとおりです。他の言語とは異なります。この動作を理解するには、配列とスライスの違いを理解することが重要です。スライスは柔軟なヘッダーとして機能し、さまざまなスライス コピーを通じて基になる配列を変更できます。
以上がGo: 配列は参照渡しですか、それとも値渡しですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。