Wie funktioniert Zeiger dereferenzieren Arbeit in golang?
Werde ich durch die golang-tutorials auf http://tour.golang.org/, und experimentierte ein bisschen mit ein paar Dinge in Beispiel 29
Für Ihre Referenz, das original-Beispiel kopiert hier:
package main
import "fmt"
type Vertex struct {
X, Y int
}
var (
p = Vertex{1, 2} //has type Vertex
q = &Vertex{1, 2} //has type *Vertex
r = Vertex{X: 1} //Y:0 is implicit
s = Vertex{} //X:0 and Y:0
)
func main() {
fmt.Println(p, q, r, s)
}
Es ist ziemlich grundlegende, die zeigen, wie Sie zum erstellen von Instanzen dieses schicke neue Struktur Vertex
. Beispiel 28, zeigt jedoch, die Bearbeitung eines vertex über einen Zeiger auf, so dass ich geändert, das Beispiel ein wenig und war überrascht von der Leistung. Hier ist die änderung:
func main() {
t := *q
q.X = 4
u := *q
fmt.Println(p, q, r, s, t, u, t == u)
}
Und die Ausgabe:
{1 2} &{4 2} {1 0} {0 0} {1 2} {4 2} false
Die Sache, die mich überrascht ist, dass t
ist nicht {4, 2}, die zu bedeuten scheint, dass eine änderung q.X
geändert, die Instanz der Struktur ist, dass q
hinwies. Aus einem C/C++ - hintergrund, scheint dies äußerst merkwürdig Verhalten zu mir.
So, was ist hier eigentlich Los? Warum hat Sie q.X = 4
zum ändern der Vertex nicht weitergegeben zu t
?
- Denken Sie daran: Gehen Sie nicht über C++ - Stil Verweise wie
int &x
. Nur gute alte Zeiger.
Du musst angemeldet sein, um einen Kommentar abzugeben.
t := *q
macht eine Kopie der struct verweistq
.Wenn Sie möchten, zu beobachten, Veränderungen zu
q
durcht
, dann stick mit einem Zeiger:Diese produziert die Ausgabe, die Sie waren wahrscheinlich auf der Suche nach.
Ich bin mir nicht sicher, was scheint sehr seltsam für Sie. C und C++ Verhalten sich auf die gleiche Weise. Betrachten Sie das folgende:
Den Ausgang dieser C++ - code zeigt das gleiche Verhalten:
t := *q
macht eine Kopie der struct verweistq
" ist die Antwort, die ich suchte. Der C++ - code, den Sie angegeben haben kann nicht kompiliert werden, wie Sie ist, und wenn ich versuche, mitnew Vertex
,g++
gibt mir immer noch einige Fehler, so es sei denn, dies wird bearbeitet, es sollte nicht behandelt werden wie ein vernünftiger Vergleich Beispiel.-std=c++11
funktioniert der trick). Sehen Sie hier ein Beispiel: coliru.stacked-crooked.com/a/2a304f24025b4d9d