Wie ändere ich Werte durch Zeigerempfängermethoden in Go?

Mary-Kate Olsen
Freigeben: 2024-11-14 21:52:02
Original
937 Leute haben es durchsucht

How to Modify Values Through Pointer Receiver Methods in Go?

Zeigerempfängermethoden und Wertänderung in Go

In Go können Sie mit einer Zeigerempfängerfunktion den Wert des Empfängerobjekts ändern. Für eine erfolgreiche Implementierung ist es jedoch von entscheidender Bedeutung, zu verstehen, wie Zeiger in Go funktionieren.

Problemlösung

Beim Versuch, den Wert eines einfachen Typs über eine Zeigerempfängermethode zu ändern, kann es zu Situationen kommen, in denen die Änderungen bleiben außerhalb der Methode nicht bestehen. Dies liegt daran, dass alle Methodenargumente, einschließlich des Empfängers, lokal innerhalb der Ausführung der Methode kopiert werden.

Methodenargumentkopie

Im bereitgestellten Beispiel:

func (fi *FooInt) FromString(i string) {
    num, _ := strconv.Atoi(i)
    tmp := FooInt(num)
    fi = &tmp
}
Nach dem Login kopieren

Die fi Das Zeigerargument ist eine Kopie des ursprünglichen fi-Zeigers in main. Daher wirken sich Änderungen, die am kopierten Fi-Zeiger innerhalb der FromString-Methode vorgenommen werden, nur auf die lokale Kopie aus, nicht auf den ursprünglichen Zeiger.

Lösung

Um dieses Problem zu beheben, gibt es einige Optionen:

  1. Den aktualisierten Zeiger zurückgeben:

Erstellen Sie eine Rückgabe Anweisung, die den aktualisierten Zeiger dem Empfänger zuweist und dann den zurückgegebenen Zeiger in main neu zuweist.

// Return the updated pointer and reassign it in main
func (fi *FooInt) FromString(i string) *FooInt {
    num, _ := strconv.Atoi(i)
    tmp := FooInt(num)
    return &tmp
}

// Reassign the updated pointer in main
func main() {
    var fi *FooInt
    fi = fi.FromString("5")
    fmt.Printf("%v %v\n", fi, *fi) // Outputs: 0xc0000b4020 5
}
Nach dem Login kopieren
  1. Übergeben Sie einen Nicht-Null-Zeiger:

Übergeben Sie einen Nicht-Null-Zeiger des Zieltyps als Argument an Methode.

// Pass a non-nil pointer as an argument
func (fi *FooInt) FromString(i string, p **FooInt) {
    num, _ := strconv.Atoi(i)
    tmp := FooInt(num)
    *p = &tmp
}

// Create a non-nil pointer and pass it to the method in main
func main() {
    var fi *FooInt
    fi.FromString("5", &fi)
    fmt.Printf("%v %v\n", fi, *fi) // Outputs: 0xc0000b4020 5
}
Nach dem Login kopieren
  1. Stellen Sie sicher, dass der Empfänger nicht Null ist:

Überprüfen Sie, ob der Empfängerzeiger ungleich Null ist, bevor Sie ihn ändern.

// Check if the receiver is non-nil before modifying
func (fi *FooInt) FromString(i string) {
    if fi == nil {
        return
    }
    num, _ := strconv.Atoi(i)
    *fi = FooInt(num)
}

// Create a non-nil receiver in main
func main() {
    fi := new(FooInt)
    fi.FromString("5")
    fmt.Printf("%v %v\n", fi, *fi) // Outputs: 0xc0000b4020 5
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie ändere ich Werte durch Zeigerempfängermethoden in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage