当前位置: > > > > 是否可以捕获这个 nil 指针错误
来源:stackoverflow
2024-04-21 08:45:33
0浏览
收藏
积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《是否可以捕获这个 nil 指针错误》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~
问题内容
我有一个编译器无法发现的“nil 指针”错误,但我想看看是否有办法通过静态分析来找到它。
所以这个bug是这样的:
package main import ( "fmt" ) type a struct { name string } func newgooda() (*a, error) { return &a{ name: "go", }, nil } func newbada() (*a, error) { return nil, fmt.errorf("failed to create a") } func (a *a) greet() string { return "hello " + a.name } func main() { valuea, err := newbada() if err != nil { fmt.printf("oops, failed because: %v", valuea.greet()) // this should be forbidden, because when err is not nil, valuea shouldn't be touched } }
当我运行它时,出现错误,因为 valuea
是 nil
。
panic: runtime error: invalid memory address or nil pointer dereference
这是一个常见的错误,但编译器无法发现。我想知道是否有任何工具可以静态分析代码并找出这一点。
如果规则是这样的话,我觉得这是可能的:
如果函数调用返回一个值和一个错误,则 if err != nil
逻辑不应触及该返回值(本例中为 valuea
),因为这很危险,而且很可能是 nil
。
有什么工具可以做到这一点吗?
解决方案
在 newbada 返回错误的情况下,即使 valuea 为 nil,也不能使用 valuea,这种说法是不正确的。 go 会很乐意在 nil 接收器上调用该函数 – 例如:
func (a *A) greet() string { if a == nil { return "(nil)" } return a.name }
今天关于《是否可以捕获这个 nil 指针错误》的内容介绍就到此结束,如果有什么疑问或者建议,可以在公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!