为什么全局变量a1不等于局部变量a2,而a2等于a3和a4
我很困惑,a1,a2,a3都是通过调用getInterface方法计算的,但是比较它们时,却得到了不同的结果。
谢谢大家看到这个问题。
import "fmt"
var a1 aInterface = getInterface()
type aInterface interface {
fun1()
}
type aInterfaceImpl struct{}
func (p *aInterfaceImpl) fun1() {
return
}
func getInterface() aInterface {
return new(aInterfaceImpl)
}
func main() {
var a2 aInterface = getInterface()
var a3 aInterface = getInterface()
var a4 aInterface = new(aInterfaceImpl)
fmt.Printf("a1 == a2, %+v\n", a1 == a2) // a1 == a2, false
fmt.Printf("a2 == a3, %+v\n", a2 == a3) // a2 == a3, true
fmt.Printf("a2 == a4, %+v\n", a2 == a4) // a2 == a4, true
}
Run Code Online (Sandbox Code Playgroud)
接口值具有可比性。如果两个接口值具有相同的动态类型和相同的动态值,或者两者都具有 value,则它们相等
nil。
在您的示例中a1,a2,a3和a4都是接口值,它们都包含具体类型的值*aInterfaceImpl,因此归结为指针比较:
指针值是可比较的。如果两个指针值指向同一个变量或两者都有 value ,则它们相等
nil。指向不同的零大小变量的指针可能相等,也可能不相等。
由于大小aInterfaceImpl为零(它是一个空的结构类型),根据规范,您不能期望它们的地址相等。他们可能有也可能没有相同的地址,两者都是有效的。
请参阅相关:为什么结构数组比较有不同的结果