当前位置: > > > > 是否可以捕获这个 nil 指针错误
是否可以捕获这个 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 指针错误》的内容介绍就到此结束,如果有什么疑问或者建议,可以在米云公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!
