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

取消引用 Go 结构会创建新副本吗?

Patricia Arquette
发布: 2024-12-01 04:58:13
原创
547 人浏览过

Does Dereferencing a Go Struct Create a New Copy?

在 Go 中解引用结构体会创建新副本吗?

在 Go 中,当结构体类型的变量通过引用传递时,使用星号 (*) 运算符,可能会产生误解,认为取消引用的变量表示与原始变量相同的地址struct.

但是,如给定的代码片段所示:

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

当我们执行此代码时,输​​出显示取消引用的变量 obj 的地址与原始 struct p 的地址不同。这是因为:

取消引用会创建一个新副本:

行 obj := *p 创建一个与 p (me) 类型相同的新变量 obj,并使用 p 指向的值的副本对其进行初始化。这意味着对 obj 所做的任何更改都不会影响原始结构。

有效地将新的结构值分配给另一个:

类似于 var obj me = *p , obj := *p 中的解引用操作将一个新的结构体值赋给变量 obj。这将创建一个具有单独内存的新副本。

谨慎使用星号运算符:

虽然星号运算符提供了指针语义,但了解其对变量的影响非常重要。当使用 *(取消引用)运算符分配值时,它会创建一个新副本,而不是对原始变量的新引用。

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

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