登录
首页 >  Golang >  Go问答

是否可以捕获这个 nil 指针错误

来源:stackoverflow

时间:2024-04-21 08:45:33 110浏览 收藏

积累知识,胜过积蓄金银!毕竟在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
    }
}

当我运行它时,出现错误,因为 valueanil

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 指针错误》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>