Go的等价物是Python的“is”运算符?

时间:2012-05-09 12:11:02

标签: python reference go instance

如何确定2个变量是否引用Go中的同一个实例?更具体地说,一个变量值的突变也会影响另一个变量的值。

进一步细化问题:我如何确定2个变量何时满足每个CPython的“is”运算符:

a is b

3 个答案:

答案 0 :(得分: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是改变c.a变化的充分条件b.a

答案 1 :(得分:3)

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

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

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

Go还有几种非指针引用类型:切片,贴图,函数和通道。使用*a == *b来确定它们是否是同一频道的频道相当。但是,无法比较切片,贴图和函数;虽然可以使用反射。

答案 2 :(得分:0)

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