为啥克隆的结构值仍然等于原始结构
Posted
技术标签:
【中文标题】为啥克隆的结构值仍然等于原始结构【英文标题】:Why cloned struct value still equals to the original struct为什么克隆的结构值仍然等于原始结构 【发布时间】:2021-02-01 08:20:17 【问题描述】:我创建了如下界面:
type cloneable interface
clone() cloneable
还有一个person
结构(实现cloneable
):
type person struct
firstName string
lastName string
age int
func (p person) clone() person
return personp.firstName, p.lastName, p.age
现在我尝试像这样克隆我的个人价值:
p1 := person"name", "last", 22
p2 := p1.clone()
fmt.Println(p2 == p1) // PRINTS 'true', why?
clone 方法按预期工作,但为什么 p2 等于 p1?这两个都是值,不是引用,怎么可能相等?
【问题讨论】:
如您所说,p1
和 p2
都是值。为什么您期望通过比较来检查对象的内存地址?您可以使用 &
来做到这一点。
Go 中没有引用。
【参考方案1】:
如果第一个结构体的所有字段类型都是comparable
,并且所有对应的字段值都是equal
,则两个结构将相等。
如果你的结构至少有一个function
或一个不可比较的值,那么你不能比较两个结构
【讨论】:
【参考方案2】:来自The Go Programming Language Specification
:
相等运算符 == 和 != 适用于可比较的操作数。 ... 这些术语和比较结果定义如下:??
The Go Programming Language Specification: Comparison operators
【讨论】:
以上是关于为啥克隆的结构值仍然等于原始结构的主要内容,如果未能解决你的问题,请参考以下文章