ホームページ  >  記事  >  バックエンド開発  >  Go言語には参照渡しはありますか?

Go言語には参照渡しはありますか?

青灯夜游
青灯夜游オリジナル
2022-12-20 12:09:355454ブラウズ

######いいえ。 Go には参照変数がないため、Go 言語で関数を呼び出すときに参照を渡すことはありません。 Go プログラムで定義されたすべての変数は、一意のメモリ位置を占有します。同じメモリ位置を共有する 2 つの変数を作成することはできません。同じメモリ位置を指す 2 つの変数を作成することはできますが、これは同じではありません。 2 つの変数が同じメモリを共有しており、場所が異なります。

Go言語には参照渡しはありますか?このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

Go には参照変数がないため、Go 言語で関数を呼び出すときに参照を渡すことがないことは明らかです。

参照変数とは何ですか?

一部の開発言語 (C など) では、既存の変数に対して別名を宣言できます。この別名は参照変数と呼ばれます。

 #include <stdio.h>
 
 int main() {
        int a = 10;
         int &b = a;
         int &c = b;
 
         printf("%p %p %p\n", &a, &b, &c); // 0x7ffe114f0b14 0x7ffe114f0b14 0x7ffe114f0b14
         return 0;
}

a、b、c がすべて同じメモリ位置を指していることがわかります。 a への書き込みは b と c に影響します。これは、別のスコープで参照変数を宣言する場合、つまり関数が呼び出される場合に便利です。

Go 言語には参照変数がありません

C とは異なり、Go プログラムで定義された各変数は一意のメモリ位置を占有します。

package main

import "fmt"

func main() {
        var a, b, c int
        fmt.Println(&a, &b, &c) // 0x1040a124 0x1040a128 0x1040a12c
}

同じメモリ位置を共有する 2 つの変数を作成することはできません。同じメモリ位置を指す 2 つの変数を作成することは可能ですが、これは同じメモリ位置を共有する 2 つの変数と同じではありません。

 package main
 
 import "fmt"
 
 func main() {
        var a int
        var b, c = &a, &a
        fmt.Println(b, c)   // 0x1040a124 0x1040a124
        fmt.Println(&b, &c) // 0x1040c108 0x1040c110
}

上記のコードでは、b と c は両方とも同じ値、つまり変数 a のアドレスを持ちますが、a と c はメモリ内の異なる場所に格納されます。 b の内容を変更しても c には影響しません。

マップとチャネルは参照変数である必要がありますね。 #########間違っている!マップとチャネルは参照ではありません。参照である場合、次のコードは false を出力します。

package main

import "fmt"

func fn(m map[int]int) {
        m = make(map[int]int)
}

func main() {
        var m map[int]int
        fn(m)
        fmt.Println(m == nil)
}
map m が C スタイルの参照変数の場合、main() で宣言された m と fn() で宣言された m は同じメモリ空間を共有します。ただし、 fn() で m に値を代入しても main() の m には影響しないため、map は参照変数ではないことがわかります。

概要

Go には参照変数がないため、Go は参照渡しを行いません。

【関連する推奨事項: Go ビデオ チュートリアル

プログラミング教育

以上がGo言語には参照渡しはありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。