Maison >développement back-end >Golang >Le déréférencement d'une structure Go crée-t-il une copie ou une référence ?

Le déréférencement d'une structure Go crée-t-il une copie ou une référence ?

DDD
DDDoriginal
2024-12-13 03:11:12550parcourir

Does Dereferencing a Go Struct Create a Copy or a Reference?

Déréférencement de structures dans Go : création de nouvelles copies

Lorsque vous travaillez avec des structures dans Go, il est important de comprendre le comportement du déréférencement. Le déréférencement d’un objet renvoie essentiellement une copie de la valeur vers laquelle il pointe. Cela peut être contre-intuitif pour certains programmeurs provenant d'autres langages, où le déréférencement renvoie généralement l'objet lui-même.

Considérez l'extrait de code Go suivant :

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)
    return &p
}

func main() {
    p := study()
    fmt.Printf("&p.color = %p\n", &p.color)

    obj := *p
    fmt.Printf("&obj.color = %p\n", &obj.color)
    fmt.Printf("obj = %+v\n", obj)

    p.color = "purple"
    fmt.Printf("p.color = %p\n", &p.color)
    fmt.Printf("p = %+v\n", p)
    fmt.Printf("obj  = %+v\n", obj)

    obj2 := *p
    fmt.Printf("obj2 = %+v\n", obj2)
}

Dans cet exemple, l'étude() La fonction crée une nouvelle structure me et renvoie un pointeur vers celle-ci. On assigne ensuite ce pointeur à une variable p. Lorsque nous déréférençons p et l'attribuons à obj, nous créons une nouvelle copie de la structure. Cette nouvelle copie a une adresse mémoire différente de la structure d'origine pointée par p.

Cela signifie que la modification des champs d'obj n'affectera pas les champs de la structure d'origine, et vice versa. Pour créer une référence à la structure d'origine, nous aurions besoin d'attribuer le pointeur de p vers obj :

obj := p

Dans ce cas, obj et p pointeraient vers la même structure et toute modification apportée à l'une d'entre elles le ferait se refléter dans l'autre.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn