当我试图打印带有未初始化的嵌入式错误的指针时,为什么会得到一个零指针错误:
package main
import (
"log"
"errors"
)
type Danger struct {
error
}
func main() {
// the nil pointer issue has to do with struct embedding an error value that is nil
d := &Danger{}
log.Println(d)
d = &Danger{errors.New("foobar")}
log.Println(d)
}结果:
2009/11/10 23:00:00 %!v(PANIC=runtime error: invalid memory address or nil pointer dereference)
2009/11/10 23:00:00 foobarhttps://play.golang.org/p/fBuN0XonX9v
这是在今天的一次面试中提到的,无论是面试官还是应聘者都找不到答案。
发布于 2018-05-12 00:00:22
等级库说:
给定结构类型S和定义类型T,促进方法包括在结构的方法集中如下:
fmt文档说:
如果操作数实现了错误接口,则将调用error方法将对象转换为字符串,然后按照谓词(如果有的话)的要求对字符串进行格式化。
由此,我们可以得出结论,log.Println(d)将从error字段调用提升的错误方法。
如果error字段是nil,那么调用就会引起恐慌。
fmt文件还说:
如果错误或字符串方法在打印例程调用时触发恐慌,则fmt包将从恐慌中重新格式化错误消息,并对其进行修饰,说明它是通过fmt包传入的。
文本%!v(PANIC=runtime error: invalid memory address or nil pointer dereference)是修饰的恐慌值。
https://stackoverflow.com/questions/50301438
复制相似问题