Heim >Backend-Entwicklung >Golang >Verfügt die Go-Sprache über eine Passby-Referenz?

Verfügt die Go-Sprache über eine Passby-Referenz?

王林
王林Original
2020-12-17 14:02:492017Durchsuche

Go-Sprache verfügt über keine Referenzübergabe. In der Go-Sprache gibt es keine Referenzvariablen. Jede im Programm definierte Variable belegt einen eindeutigen Speicherort, daher kann die Go-Sprache nicht zwei Variablen erstellen, die denselben Speicherort teilen.

Verfügt die Go-Sprache über eine Passby-Referenz?

Die Umgebung dieses Artikels: Windows 10-System, Go 1.11.2-Version, dieser Artikel gilt für alle Computermarken.

(Lernvideo-Sharing: Programmiervideo)

Zunächst muss klar sein, dass Go keine Referenzvariablen hat, es also keine Referenzübergabe beim Aufruf von Funktionen in der Go-Sprache gibt.

Was ist eine Referenzgröße?

In einigen Entwicklungssprachen (z. B. C++) können Aliase für vorhandene Variablen deklariert werden. Dieser Alias ​​wird als Referenzvariable bezeichnet.

 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}

Sie können sehen, dass a, b und c alle auf denselben Speicherort verweisen. Das Schreiben an a wirkt sich auf b und c aus. Dies ist nützlich, wenn Sie eine Referenzvariable in einem anderen Bereich deklarieren möchten, z. B. wenn eine Funktion aufgerufen wird.

Die Go-Sprache hat keine Referenzvariablen

Im Gegensatz zu C++ belegt jede in einem Go-Programm definierte Variable einen eindeutigen Speicherort.

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

Es ​​ist nicht möglich, zwei Variablen zu erstellen, die denselben Speicherort teilen. Es ist möglich, zwei Variablen zu erstellen, die auf denselben Speicherort verweisen. Dies ist jedoch nicht dasselbe wie zwei Variablen, die denselben Speicherort teilen.

 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}

Im obigen Code haben b und c beide den gleichen Wert – also die Adresse der Variablen a, aber a und c werden an unterschiedlichen Orten im Speicher gespeichert. Eine Änderung des Inhalts von b hat keine Auswirkungen auf c.

Karte und Kanal sind Referenzen?

Falsch! Karte und Kanal sind keine Referenzen. Wenn dies der Fall wäre, würde der folgende Code „false“ ausgeben.

Wenn Map m eine Referenzvariable im C++-Stil ist, teilen sich m, das in main() deklariert ist, und m, das in fn() deklariert ist, denselben Speicherplatz. Da sich die Zuweisung eines Werts zu m in fn() jedoch nicht auf m in main() auswirkt, können wir sehen, dass Map keine Referenzvariable ist.

Zusammenfassung

Go wird nicht als Referenz übergeben, da Go keine Referenzvariablen hat.

Verwandte Empfehlungen: Golang-Tutorial

Das obige ist der detaillierte Inhalt vonVerfügt die Go-Sprache über eine Passby-Referenz?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn