3

How do I determine whether 2 variables refer to the same instance in Go? More specifically, that a mutation to the value of one variable would effect the value of the other variable also.

To further refine the question: How would I determine when 2 variables would satisfy the "is" operator per CPython:

a is b
4

3 回答 3

3

编辑:我不确定你想要什么。如果是关于变量的相等性或变量值的同一性。这个答案是针对第二个的(“2 个变量指的是同一个值的实例”)。如果我误解了,我会删除这个答案。

==是你想要的,我想。

如果 a 和 b 的类型是指针,则a==b意味着 a 和 b 是指向相同值的指针。

以下程序打印false

package main

import "fmt"

type test struct {
    a int
}

func main() {

    b := &test{2}
    c := &test{2}
    fmt.Println(c == b)

}

虽然这打印true

    b := &test{2}
    c := b
    fmt.Println(c == b)

c==b 是改变 ca 改变 ba 的充分条件

于 2012-05-09T12:25:39.253 回答
3

在 Python 中,所有值都是对象的引用(即指针)。您永远无法将对象本身作为值。运算符比较is两个值,它们是指针,用于指针相等;而==运算符比较两个这样的指针,以确定所指向对象的相等性。

在 Go 中,它有点复杂。Go 有指针,以及其他非指针类型(布尔、数字类型、字符串、数组、切片、结构、函数、接口、映射、通道)。要求非指针类型的指针相等是没有意义的。(这意味着什么?它会完成什么?)

所以为了和 Python 一样,让我们​​把所有的值都放在指针后面,所以所有的变量都是指针。(在许多 Go 库中都有一个创建指针类型的“New”函数的约定;并且这些方法也对指针类型进行操作;因此这与该约定兼容。)Go 中的(如果ab是指针)将a == b比较两个这样的指针是否相等;*a == *b如果它们具有可比性,您可以使用它们来比较基础值。

Go 还有几种非指针引用类型:切片、映射、函数和通道。频道是可比较==的,它们是否是同一个频道。但是,切片、映射和函数不能进行比较;不过可以使用反射。

于 2012-05-09T18:29:44.363 回答
0

在非接口和非函数类型的情况下,可以比较指针是否相等。非指针类型不能共享实例,OTOH。

于 2012-05-09T12:31:09.830 回答