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

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

王林
王林オリジナル
2020-12-17 14:02:492075ブラウズ

Go 言語には参照の受け渡しがありません。 Go 言語には参照変数がありません。プログラムで定義された各変数は一意のメモリ位置を占有するため、Go 言語は同じメモリ位置を共有する 2 つの変数を作成できません。

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

#この記事の環境: Windows 10 システム、Go 1.11.2 バージョン、この記事はすべてのブランドのコンピューターに適用されます。

(学習ビデオ共有:

プログラミング ビデオ)

まず、Go には参照変数がないため、呼び出し時に参照が渡されないことを明確にする必要があります。 Go 言語の関数。

参照変数とは何ですか?

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

 1#include <stdio.h>
 2
 3int main() {
 4        int a = 10;
 5        int &b = a;
 6        int &c = b;
 7
 8        printf("%p %p %p\n", &a, &b, &c); // 0x7ffe114f0b14 0x7ffe114f0b14 0x7ffe114f0b14
 9        return 0;
10}

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

Go 言語は変数を参照しません

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

1package main
2
3import "fmt"
4
5func main() {
6        var a, b, c int
7        fmt.Println(&a, &b, &c) // 0x1040a124 0x1040a128 0x1040a12c
8}

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

 1package main
 2
 3import "fmt"
 4
 5func main() {
 6        var a int
 7        var b, c = &a, &a
 8        fmt.Println(b, c)   // 0x1040a124 0x1040a124
 9        fmt.Println(&b, &c) // 0x1040c108 0x1040c110
10}

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

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

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

概要

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

関連する推奨事項:

golang チュートリアル

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

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