Golang のスライスは、値によって関数に渡される場合でも、元の配列をどのように変更するのでしょうか?

Linda Hamilton
リリース: 2024-10-30 12:34:15
オリジナル
520 人が閲覧しました

How do slices in Golang modify the original array even though they are passed to functions by value?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!