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.
InformationsquelleAutor Kevin | 2014-11-23
Schreibe einen Kommentar