In Go ermöglichen Ihnen Zeigerempfänger in Methoden, den ursprünglichen Wert einer Struktur zu ändern. Dies gilt jedoch nicht für einfache Typen. Diese Frage untersucht, warum solche Änderungen nicht funktionieren, und stellt Lösungen vor.
Bedenken Sie diesen Code:
package main import ( "fmt" "strconv" ) type FooInt int func (fi *FooInt) FromString(i string) { num, _ := strconv.Atoi(i) tmp := FooInt(num) fi = &tmp } func main() { var fi *FooInt fi.FromString("5") fmt.Printf("%v\n", fi) // Prints <nil> }
Hier würden Sie die Funktion FromString erwarten um den Wert von fi auf 5 zu setzen. Aber es gibt
In Go sind Funktions-/Methodenargumente, einschließlich des Empfängers Kopien der Originalwerte. Daher wirken sich Änderungen innerhalb der Funktion nur auf die Kopie aus.
Auch bei Zeigern ist der Empfänger eine Kopie des ursprünglichen Zeigers, nicht der eigentliche Zeiger selbst. Daher wirken sich Änderungen am Empfängerwert nicht auf den ursprünglichen Zeiger aus.
Um dieses Problem zu beheben, gibt es mehrere Optionen:
Geänderten Zeiger zurückgeben:
func (fi *FooInt) FromString(i string) *FooInt { num, _ := strconv.Atoi(i) tmp := FooInt(num) return &tmp } func main() { var fi *FooInt fi = fi.FromString("5") fmt.Printf("%v %v\n", fi, *fi) // Prints 0xc0000b4020 5 }
Übergeben Sie einen Zeiger zum Ändern:
func (fi *FooInt) FromString(i string, p **FooInt) { num, _ := strconv.Atoi(i) tmp := FooInt(num) *p = &tmp } func main() { var fi *FooInt fi.FromString("5", &fi) fmt.Printf("%v %v\n", fi, *fi) // Prints 0xc0000b4020 5 }
Stellen Sie sicher, dass der Empfänger nicht Null ist:
func (fi *FooInt) FromString(i string) { num, _ := strconv.Atoi(i) *fi = FooInt(num) } func main() { fi := new(FooInt) // Initialize to non-nil fi.FromString("5") fmt.Printf("%v %v\n", fi, *fi) // Prints 0xc0000b4020 5 }
Durch die Übernahme einer dieser Lösungen können Sie den Wert einfacher Typen mithilfe von Zeigerempfängern effektiv ändern.
Das obige ist der detaillierte Inhalt vonWarum kann ich den Wert eines einfachen Typs nicht mithilfe eines Zeigerempfängers in Go ändern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!