此代码从同一指针创建两个接口变量。打印件表明它们是相同的指针(而不是存储s
和s2
的副本)。然而,最后一次打印显示i1
与i2
不同。为什么呢?
package main
import "fmt"
func main() {
var s T = &struct{string}{}
var s2 *struct{string} = s
var i1 interface{} = s
var i2 interface{} = s2
fmt.Println(s)
s.string = "s is i1"
fmt.Println(i1)
s.string = "s is i2"
fmt.Println(i2)
fmt.Println(i1==i2)
}
type T *struct{string}
$ go run a.go
&{}
&{s is i1}
&{s is i2}
false
答案 0 :(得分:3)
以下是Go langauge规范says about comparing interface values:
如果两个接口值具有相同的动态类型和相同的动态值,或两者的值都为nil,则它们相等。
i1
中的值具有指定类型T
。 i2
中的值具有匿名类型*struct{string}
。由于这两个值具有不同的动态类型,因此接口值不相等。
要查看类型,请将此行添加到您的程序中:
fmt.Printf("i1: %T, i2: %T\n", i1, i2)
此行将打印:
i1: main.T, i2: *struct { string }
答案 1 :(得分:2)
这类似于检查覆盖error
的{{1}}的{{1}}值,基本上为了传递相等,它们必须具有相同的值和类型{{1类型为nil
,i1
类型为T
。