无指针嵌入错误

  • 本文关键字:错误 指针 go null
  • 更新时间 :
  • 英文 :


为什么当我尝试打印带有未初始化嵌入式错误的指针时出现 nil 指针错误:

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 foobar

https://play.golang.org/p/fBuN0XonX9v

这在今天的一次采访中被提出来,采访者和受访者都想不通。

规范说:

给定结构类型 S 和定义的类型 T,提升的方法包含在结构的方法集中,如下所示:

如果 S 包含
  • 嵌入字段 T,则 S 和 *S 的方法集都包含具有接收方 T 的提升方法。*S 的方法集还包括带有接收器 *T 的提升方法。

FMT 文档说:

如果操作数实现错误接口,则将调用 Error 方法将对象转换为字符串,然后根据谓词(如果有(的要求设置该字符串的格式。

由此,我们可以得出结论,log.Println(d)将从error字段中调用提升的 Error 方法。

如果error字段为nil,则呼叫会死机。

FMT 文档还说:

如果 Error 或 String 方法在由打印例程调用时触发崩溃,则 fmt 包会重新格式化恐慌中的错误消息,并用指示它来自 fmt 包来修饰它。

文本%!v(PANIC=runtime error: invalid memory address or nil pointer dereference)是修饰的恐慌值。

相关内容

  • 没有找到相关文章

最新更新