等号指针不同?

这段代码从同一个指针创建了两个接口变量。打印件表明它们是相同的指针(与存储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


偶然的你
浏览 179回答 2
2回答

慕森卡

以下是 Go 语言规范关于比较接口值的说明:如果两个接口值具有相同的动态类型和相等的动态值,或者两者的值为 nil,则它们相等。中的值i1具有命名类型T。中的值i2具有匿名类型*struct{string}。由于两个值具有不同的动态类型,因此接口值不相等。要查看类型,请将此行添加到您的程序中:fmt.Printf("i1: %T, i2: %T\n", i1, i2)这一行将打印:i1: main.T, i2: *struct { string }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go