Heim > Backend-Entwicklung > Golang > Wie wirkt sich die Pass-by-Value-Semantik von Go auf die Manipulation von Strukturzeigern aus?

Wie wirkt sich die Pass-by-Value-Semantik von Go auf die Manipulation von Strukturzeigern aus?

Mary-Kate Olsen
Freigeben: 2024-12-03 15:55:12
Original
1014 Leute haben es durchsucht

How Do Go's Pass-by-Value Semantics Affect Struct Pointer Manipulation?

Inspizieren von Objektzeigerwerten in Go

In Go werden Funktionsargumente als Wert übergeben, was bedeutet, dass alle an den Argumenten innerhalb der Funktion vorgenommenen Änderungen keine Auswirkungen auf das Original haben Werte außerhalb der Funktion. Dies kann beim Umgang mit Strukturen verwirrend sein, da Sie möglicherweise davon ausgehen, dass sie als Referenz übergeben werden.

Um zu verstehen, wie dies funktioniert, betrachten Sie den folgenden Codeausschnitt:

package main

import (
    "fmt"
    "runtime"
)

type Something struct {
    number int
    queue  chan int
}

func gotest(s *Something, done chan bool) {
    fmt.Printf("from gotest:\n&s: %p\n", &s)
    for num := range s.queue {
        fmt.Println(num)
        s.number = num
    }
    done <- true
}

func main() {
    runtime.GOMAXPROCS(4)
    s := &Something{number: 42}
    fmt.Printf("&s: %p\n", &s)

    s.queue = make(chan int)
    done := make(chan bool)

    go gotest(s, done)
    s.queue <- 43

    close(s.queue)
    <-done

    fmt.Printf("&s: %p\n", &s)
    fmt.Println(s.number) // Output: 43
}
Nach dem Login kopieren

Dieser Code demonstriert Übergabe eines Strukturzeigers als Wert. In der Hauptfunktion erstellen wir eine Instanz von Something und übergeben einen Zeiger darauf an die Gotest-Funktion.

Innerhalb der Gotest-Funktion ändern wir das Zahlenfeld der Struktur und übergeben auch Nachrichten an ihren Warteschlangenkanal. Die Gotest-Funktion arbeitet mit einer Kopie des Zeigers, sodass alle von ihr vorgenommenen Änderungen keinen Einfluss auf die ursprüngliche Struktur in der Hauptfunktion haben.

Mit dem &s-Ausdruck können wir die Zeigerwerte in verschiedenen Phasen der Ausführung beobachten. Die Ausgabe zeigt Folgendes:

  • In der Hauptfunktion ist vor dem Aufruf von gotest der Zeigerwert von s mit dem Zeigerwert des &s-Ausdrucks identisch, was darauf hinweist, dass s tatsächlich ein Zeiger ist.
  • Innerhalb der Gotest-Funktion unterscheidet sich der Zeigerwert von &s vom Zeigerwert von s, was bestätigt, dass s eine Kopie des Zeigers im Hauptteil ist Funktion.

Dieses Verhalten steht im Einklang mit der Pass-by-Value-Semantik von Go, bei der Argumente in den Gültigkeitsbereich der Funktion kopiert werden. Wenn Sie also die ursprüngliche Struktur ändern möchten, sollten Sie einen Zeiger auf diese und nicht auf die Struktur selbst übergeben.

Das obige ist der detaillierte Inhalt vonWie wirkt sich die Pass-by-Value-Semantik von Go auf die Manipulation von Strukturzeigern aus?. 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