ホームページ > バックエンド開発 > Golang > Go: 配列は参照渡しですか、それとも値渡しですか?

Go: 配列は参照渡しですか、それとも値渡しですか?

Mary-Kate Olsen
リリース: 2024-10-30 04:17:02
オリジナル
450 人が閲覧しました

Go: Do Arrays Pass by Reference or Value?

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 に配列があるのですか?
  • Go スライスは値渡しですか?

結論

配列を渡す Go のアプローチは次のとおりです。他の言語とは異なります。この動作を理解するには、配列とスライスの違いを理解することが重要です。スライスは柔軟なヘッダーとして機能し、さまざまなスライス コピーを通じて基になる配列を変更できます。

以上がGo: 配列は参照渡しですか、それとも値渡しですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート