【问题标题】: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 person{p.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 中没有引用。

标签: go reference pass-by-value


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    来自The Go Programming Language Specification

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

    The Go Programming Language Specification: Comparison operators

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-16
      • 2012-08-12
      相关资源
      最近更新 更多