如何确定2个变量是否引用Go中的同一个实例?更具体地说,一个变量值的突变也会影响另一个变量的值。
进一步细化问题:我如何确定2个变量何时满足每个CPython的“is”运算符:
a is b
答案 0 :(得分:3)
==
就是你想要的。
如果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。