为啥克隆的结构值仍然等于原始结构

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?这两个都是值,不是引用,怎么可能相等?

【问题讨论】:

如您所说,p1p2 都是值。为什么您期望通过比较来检查对象的内存地址?您可以使用 & 来做到这一点。 Go 中没有引用。 【参考方案1】:

如果第一个结构体的所有字段类型都是comparable,并且所有对应的字段值都是equal,则两个结构将相等。

如果你的结构至少有一个function 或一个不可比较的值,那么你不能比较两个结构

【讨论】:

【参考方案2】:

来自The Go Programming Language Specification

相等运算符 ==!= 适用于可比较的操作数。 ... 这些术语和比较结果定义如下:??

The Go Programming Language Specification: Comparison operators

【讨论】:

以上是关于为啥克隆的结构值仍然等于原始结构的主要内容,如果未能解决你的问题,请参考以下文章

为啥结构的大小不等于其各个成员类型的大小之和? [复制]

为啥结构对齐取决于字段类型是原始类型还是用户定义?

为啥在释放指向它的指针后仍然可以访问结构的成员?

当按值提供给函数时,结构的数组字段是不是会被完全克隆?

数据结构与算法之深入解析“找出克隆二叉树中的相同节点”的求解思路与算法示例

如何使用 jQuery 克隆没有数据但只有结构的 <tr> 元素?