首页 > 后端开发 > Golang > 取消引用 Go 结构会创建副本还是引用?

取消引用 Go 结构会创建副本还是引用?

DDD
发布: 2024-12-13 03:11:12
原创
502 人浏览过

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

Go 中解引用结构:创建新副本

在 Go 中使用结构时,了解解引用的行为非常重要。取消引用一个对象本质上会返回它所指向的值的副本。对于一些来自其他语言的程序员来说,这可能是违反直觉的,在这些语言中,取消引用通常会返回对象本身。

考虑以下 Go 代码片段:

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)
}
登录后复制

在此示例中,study()函数创建一个新的 me 结构并返回指向它的指针。然后我们将这个指针赋给变量 p。当我们取消引用 p 并将其分配给 obj 时,我们创建了该结构的一个新副本。这个新副本与 p 指向的原始结构体具有不同的内存地址。

这意味着更改 obj 的字段不会影响原始结构体的字段,反之亦然。要创建对原始结构的引用,我们需要将指针从 p 分配给 obj:

obj := p
登录后复制

在这种情况下,obj 和 p 将指向相同的结构,并且对其中之一所做的任何更改都会反映在对方身上。

以上是取消引用 Go 结构会创建副本还是引用?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板