等指针不同?

时间:2014-09-09 16:16:11

标签: pointers go

此代码从同一指针创建两个接口变量。打印件表明它们是相同的指针(而不是存储ss2的副本)。然而,最后一次打印显示i1i2不同。为什么呢?

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

2 个答案:

答案 0 :(得分:3)

以下是Go langauge规范says about comparing interface values

  

如果两个接口值具有相同的动态类型和相同的动态值,或两者的值都为nil,则它们相等。

i1中的值具有指定类型Ti2中的值具有匿名类型*struct{string}。由于这两个值具有不同的动态类型,因此接口值不相等。

要查看类型,请将此行添加到您的程序中:

fmt.Printf("i1: %T, i2: %T\n", i1, i2)

此行将打印:

i1: main.T, i2: *struct { string }

答案 1 :(得分:2)

这类似于检查覆盖error的{​​{1}}的{​​{1}}值,基本上为了传递相等,它们必须具有相同的值和类型{{1类型为nili1类型为T