Heim >Backend-Entwicklung >Golang >Erstellt die Dereferenzierung einer Go-Struktur eine neue Kopie?

Erstellt die Dereferenzierung einer Go-Struktur eine neue Kopie?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-01 04:58:13558Durchsuche

Does Dereferencing a Go Struct Create a New Copy?

Erstellt die Dereferenzierung einer Struktur eine neue Kopie in Go?

In Go, wenn eine Variable eines Strukturtyps per Referenz mit übergeben wird Wenn Sie den Sternchen (*)-Operator verwenden, kann es zu der falschen Annahme kommen, dass die dereferenzierte Variable dieselbe Adresse wie das Original darstellt struct.

Wie jedoch im angegebenen Codeausschnitt gezeigt:

package main

import (
    "fmt"
)

type me struct {
    color string
    total int
}

func study() *me {
    p := me{}
    p.color = "tomato"
    fmt.Printf("%p\n", &p.color) // Address of p.color
    return &p
}

func main() {
    p := study() // p is a pointer to a struct
    fmt.Printf("&p.color = %p\n", &p.color) // Address of p.color

    obj := *p // obj is a copy of the struct pointed to by p
    fmt.Printf("&obj.color = %p\n", &obj.color) // Address of obj.color

    fmt.Printf("obj = %+v\n", obj)

    p.color = "purple" // Changes color of the struct pointed by p
    fmt.Printf("p.color = %p\n", &p.color)
    fmt.Printf("p = %+v\n", p)
    fmt.Printf("obj  = %+v\n", obj)

    obj2 := *p // Another copy is made
    fmt.Printf("obj2 = %+v\n", obj2)
}

Wenn wir diesen Code ausführen, zeigt die Ausgabe, dass die dereferenzierte Variable obj eine andere Adresse als die ursprüngliche Struktur p hat . Dies liegt daran:

Dereferenzierung erstellt eine neue Kopie:

Die Zeile obj := *p erstellt eine neue Variable obj vom gleichen Typ wie p (me), und initialisiert es mit einer Kopie des Werts, auf den p zeigt. Dies bedeutet, dass alle an obj vorgenommenen Änderungen keinen Einfluss auf die ursprüngliche Struktur haben.

Effektive Zuweisung eines neuen Strukturwerts zu einer anderen:

Ähnlich wie var obj me = *p , weist die Dereferenzierungsoperation in obj := *p der Variablen obj einen neuen Strukturwert zu. Dadurch wird eine neue Kopie mit separatem Speicher erstellt.

Verwenden Sie den Sternchenoperator mit Vorsicht:

Während der Sternchenoperator Zeigersemantik bereitstellt, ist es wichtig, seine Auswirkungen auf Variablen zu verstehen . Wenn ein Wert mit dem Operator * (Dereferenzierung) zugewiesen wird, wird eine neue Kopie erstellt, kein neuer Verweis auf die ursprüngliche Variable.

Das obige ist der detaillierte Inhalt vonErstellt die Dereferenzierung einer Go-Struktur eine neue Kopie?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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