【发布时间】:2016-12-28 08:11:11
【问题描述】:
我试图了解如何在两个对象实现相同的接口时检查它们是否相同。
示例代码如下:
package main
import (
"fmt"
)
type shout interface {
echo()
}
type a struct {}
func (*a) echo () {
fmt.Println("a")
}
type b struct {}
func (*b) echo () {
fmt.Println("b")
}
func compare(a, b shout) {
//fmt.Println(&a, &b)
if a == b {
fmt.Println("same")
} else {
fmt.Println("not same")
}
}
func main() {
a1 := &a{}
b1 := &b{}
a2 := &a{}
a1.echo()
b1.echo()
compare(a1, b1)
compare(a1, a2)
compare(a1, a1)
}
https://play.golang.org/p/qo9XnbthMw
结果是:
not same
not same
same
a1和a2不一样
但是如果取消注释 #22 行
fmt.Println(&a, &b)
结果是:
0x1040a120 0x1040a128
not same
0x1040a140 0x1040a148
same
0x1040a158 0x1040a160
same
有谁知道这里发生了什么? Golang 编译器是否优化了某些东西?
谢谢
【问题讨论】:
-
有或没有第22行,结果相同
-
对不起,我已经更新了代码
-
添加``` a1.echo() b1.echo() ``` 结果不一样
-
我会在go-nuts 上发帖。在我看来,优化过程中发生了一些事情。
-
@sounder 在我更新此代码后你有什么想法吗?