Go 解引用:是否复制,这是问题
使用解引用运算符 (*) 访问 Go 结构体时,用户可能会想知道结果是结构的新副本还是对原始结构的引用
理解行为
在提供的代码片段中:
type me struct { color string total int } func study() *me { p := me{} return &p } obj := *study()
study() 返回一个指向 me 结构的指针。在 obj 中取消引用它会创建该结构的副本。这从 &p.color 和 &obj.color 的内存地址中可以明显看出,它们是不同的。
人们可能期望解除引用的 struct obj 与原始结构具有相同的内存地址,但情况并非如此这个例子。这种行为可以归因于 Go 在变量作用域末尾自动释放变量。
当它实际上是一个引用时
要实现引用行为,可以分配一个使用以下方式直接指向结构体:
obj := study()
在这种情况下, obj 将是指向原始 me 结构体的指针,并且对 p 或 obj 的更改都会影响相同的底层结构。
结论
在 Go 中取消引用结构时,重要的是要了解结果是以下内容的副本原始结构,除非显式分配了指向该结构的指针。此行为确保对取消引用的结构所做的更改不会影响原始结构,从而保持封装和变量独立性。
以上是Go 的解引用运算符是否创建对原始结构的副本或引用?的详细内容。更多信息请关注PHP中文网其他相关文章!