Heim > Backend-Entwicklung > Golang > Warum kann ich den Wert eines einfachen Typs nicht mithilfe eines Zeigerempfängers in Go ändern?

Warum kann ich den Wert eines einfachen Typs nicht mithilfe eines Zeigerempfängers in Go ändern?

Barbara Streisand
Freigeben: 2024-11-16 06:53:03
Original
325 Leute haben es durchsucht

Why Can't I Modify a Simple Type's Value Using a Pointer Receiver in Go?

Wie ändere ich den Wert eines einfachen Typs über einen Zeigerempfänger in Go?

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.

Problem

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>
}
Nach dem Login kopieren

Hier würden Sie die Funktion FromString erwarten um den Wert von fi auf 5 zu setzen. Aber es gibt aus, was einen Nullzeiger anzeigt.

Verstehen des Verhaltens

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.

Lösungen

Um dieses Problem zu beheben, gibt es mehrere Optionen:

  1. Geänderten Zeiger zurückgeben:

    • Ändern Sie die Funktion, um den geänderten Zeiger zurückzugeben und ihn dem ursprünglichen Zeiger zuzuweisen.
    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
    }
    Nach dem Login kopieren
  2. Übergeben Sie einen Zeiger zum Ändern:

    • Übergeben Sie einen Nicht-Null-Zeiger des gewünschten Typs an die Funktion und ändern Sie ihren Wert.
    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
    }
    Nach dem Login kopieren
  3. Stellen Sie sicher, dass der Empfänger nicht Null ist:

    • Initialisieren Sie den Empfänger auf einen Wert ungleich Null, bevor Sie die Methode aufrufen, damit darauf hingewiesen wird Der Wert kann geändert werden.
    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
    }
    Nach dem Login kopieren

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!

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