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

Why cloned struct value still equals to the original struct

提问人:Two Horses 提问时间:10/18/2020 最后编辑:Jonathan HallTwo Horses 更新时间:10/21/2020 访问量:67

问:

我创建了以下界面:

type cloneable interface {
    clone() cloneable
}

还有一个结构体(实现):personcloneable

type person struct {
    firstName string
    lastName  string
    age       int
}

func (p person) clone() person {
    return person{p.firstName, p.lastName, p.age}
}

现在我尝试像这样克隆我的人值:

p1 := person{"name", "last", 22}
p2 := p1.clone()

fmt.Println(p2 == p1) // PRINTS 'true', why?

克隆方法按预期工作,但为什么 p2 等于 p1?这些都是值,而不是参考,它们怎么可能相等?

Go 引用 按值传递

评论

2赞 super 10/18/2020
正如你所说,和都是价值观。为什么需要比较来检查对象的内存地址?您可以通过使用 来做到这一点。p1p2&
2赞 Volker 10/18/2020
Go 中没有引用。

答:

2赞 ttrasn 10/18/2020 #1

如果首先,两个结构将相等,它们的所有字段类型都是,并且所有相应的字段值都是 。comparableequal

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

0赞 kozmo 10/20/2020 #2

从:The Go Programming Language Specification

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

Go 编程语言规范:比较运算符