首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >零指针嵌入错误

零指针嵌入错误
EN

Stack Overflow用户
提问于 2018-05-11 23:22:55
回答 1查看 822关注 0票数 1

当我试图打印带有未初始化的嵌入式错误的指针时,为什么会得到一个零指针错误:

代码语言:javascript
复制
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)
}

结果:

代码语言:javascript
复制
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

这是在今天的一次面试中提到的,无论是面试官还是应聘者都找不到答案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-12 00:00:22

等级库说:

给定结构类型S和定义类型T,促进方法包括在结构的方法集中如下:

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

fmt文档说:

如果操作数实现了错误接口,则将调用error方法将对象转换为字符串,然后按照谓词(如果有的话)的要求对字符串进行格式化。

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

如果error字段是nil,那么调用就会引起恐慌。

fmt文件还说:

如果错误或字符串方法在打印例程调用时触发恐慌,则fmt包将从恐慌中重新格式化错误消息,并对其进行修饰,说明它是通过fmt包传入的。

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50301438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档