bigwhite / GoProgrammingFromBeginnerToMaster

Go语言精进之路书籍配套代码
Apache License 2.0
247 stars 82 forks source link

第一册P257页的示例代码的疑惑 #38

Closed Laevon closed 1 month ago

Laevon commented 1 month ago

2023年10月版本,示例:

type T int

func (t T) Error() string {
    return "bad error"
}

func main() {
    var eif interface{} = T(5)
    var err error = T(5)
    println("eif:", eif)
    println("err:", err)
    println("eif = err:", eif == err)

    dumpEface(eif)
    dumpItabOfIface(unsafe.Pointer(&err))
    dumpDataOfIface(err)
}

为什么在调用dumpEface(eif)后,eif的data值为bad error而不是5呢,空接口赋值为T类型值5时,也会隐式调用Error方法吗?

bigwhite commented 1 month ago

看本仓库的chapter5/sources/dumpinterface.go。这里面dumpEface会判断i.type,如果是T类型,则调用dumpT,而后者实现如下:

func dumpT(dataOfIface unsafe.Pointer) {
    var p *T = (*T)(dataOfIface)
    fmt.Printf("\t data: %+v\n", *p)
}

是这里的Printf会调用T的Error函数返回bad error。

Laevon commented 1 month ago

看本仓库的chapter5/sources/dumpinterface.go。这里面dumpEface会判断i.type,如果是T类型,则调用dumpT,而后者实现如下:

func dumpT(dataOfIface unsafe.Pointer) {
    var p *T = (*T)(dataOfIface)
    fmt.Printf("\t data: %+v\n", *p)
}

是这里的Printf会调用T的Error函数返回bad error。

谢谢您如此及时的回复!