Golang Zeiger
Ich bin derzeit lernen zu Programmieren, Gehen mit Sprache.
Ich habe einige Schwierigkeiten Verständnis Zeiger Gehen (und meine C/C++ ist weit Weg jetzt...).
Bei der Tour von Go #52 (http://tour.golang.org/#52) zum Beispiel, ich lese:
type Vertex struct {
X, Y float64
}
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func main() {
v := &Vertex{3, 4}
fmt.Println(v.Abs())
}
Aber, wenn anstelle von
func (v *Vertex) Abs() float64 {
[...]
v := &Vertex{3, 4}
Schrieb ich:
func (v Vertex) Abs() float64 {
[...]
v := Vertex{3, 4}
Oder auch:
func (v Vertex) Abs() float64 {
[...]
v := &Vertex{3, 4}
werden, und Umgekehrt:
func (v *Vertex) Abs() float64 {
[...]
v := Vertex{3, 4}
Bekam ich genau das gleiche Ergebnis. Gibt es einen Unterschied (Speicher-Weise, etc.)?
InformationsquelleAutor der Frage merlin Gaillard | 2013-02-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es zwei verschiedene Regeln, die der Sprache Ihrer Beispiele:
Ist es möglich abzuleiten, die eine Methode mit einem Zeiger Empfänger eine Methode mit einem Wert-receiver. So
func (v Vertex) Abs() float64
generiert automatisch eine zusätzliche Methode Durchführung:Der compiler findet automatisch die generierte Methode:
Gehen können automatisch die Adresse einer variable. In dem folgenden Beispiel:
den Ausdruck
v.Abs()
entspricht dem folgenden code:InformationsquelleAutor der Antwort
Gibt es Unterschiede. Zum Beispiel, die nicht-Zeiger-Empfänger form Kräfte, der Methode mit einer Kopie arbeiten. Die Methode ist nicht in der Lage zu mutieren, die Instanz Sie aufgerufen wurde - ist es nur die Kopie. Das könnte unwirksam sein, z.B. hinsichtlich der Zeit - /Speicher-performance/Verbrauch etc.
OTOH, Zeiger auf Instanzen und Methoden, mit Zeiger-Empfänger ermöglichen eine einfache Beispiel-teilen (und mutiert), wo wünschenswert.
Mehr details hier.
InformationsquelleAutor der Antwort zzzz
Der Unterschied ist pass-by-referenve vs pass-by-value.
In
func f(v Vertex)
das argument ist kopiert in parameterv
. Infunc f(v *Vertex)
einen Zeiger auf einen vorhandenenVertex
Instanz übergeben wird.Beim Einsatz von Methoden, einige der Dereferenzierung kann für Sie getan werden, so können Sie eine Methode
func (v *Vertex) f()
und nennen Sie es, ohne einen Zeiger zuerst:v := Vertex{...}; v.f()
. Dies ist nur ein Körnchen syntax-Zucker, AFAIK.InformationsquelleAutor der Antwort 9000
Gibt es zwei wesentliche Unterschiede in den Beispielen:
Dem Empfänger werden übergeben durch Referenz für v und Sie wäre in der Lage, rufen Sie diese Methode nur auf Zeiger:
Auf der anderen Seite
Rufen Sie diese Methode auf Zeigern und Strukturen. Der Empfänger wird passed-by-valueauch wenn Sie diese Methode aufrufen für Zeiger.
Können Sie erklären beide
func (v *Vertex)
undfunc (v Vertex)
.InformationsquelleAutor der Antwort ndyakov
Als die Spezifikation sagt
In Ihrem Fall v. Abs() ist die Kurzform für &v. Abs() wenn die Methode adressierbar ist.
InformationsquelleAutor der Antwort Kasinath Kottukkal