【问题标题】:How to check whether the value of a pointer is nil or not in golang?如何在golang中检查指针的值是否为nil?
【发布时间】:2021-11-16 07:27:57
【问题描述】:

我有一个使用argparsegolang 项目,它接受一个不需要的文件作为参数。使用File flag 检索文件,这可能会为文件分配一些内存。代码:

package main

import (
    "fmt"
    "log"
    "os"

    "github.com/akamensky/argparse"
)

func main() {
    parser := argparse.NewParser("", "")

    myFile := parser.File("", "file", os.O_RDONLY, 0444, &argparse.Options{Required: false})

    if err := parser.Parse(os.Args); err != nil {
        log.Fatalf("error at parsing: %v", err)
    }

    if myFile != nil {
        fmt.Println(myFile)
        myFile.Stat()
    }
}

当我运行我的命令时,我的输出是

&{<nil>}
panic: runtime error: invalid memory address or nil pointer dereference

说我正在取消引用 nil 指针,但是当我检查指针是否为 nil 时,它说它不是,尽管 Println 返回一个值为 nil 的指针。 如何检查文件指针的内容是否为nil

注意:错误来自 myFile.Stat()

【问题讨论】:

  • 您应该首先检查parser.Parse 返回的错误。如果这不起作用,请显示一个最小的可重现示例和带有行号的堆栈跟踪。
  • parser.Parse 不返回任何错误,错误来自myFile.Stat()
  • 可以,但你忽略了它。同样,我们需要一个可重现的例子。
  • 添加了它,只是在这段代码中没有,而不是在原始代码中
  • 当人们要求“可重现的示例”时,他们要求的是可以复制、粘贴和运行以重现问题的东西。我在您的问题中添加了缺失的部分,因为我对答案感兴趣。

标签: go pointers


【解决方案1】:

您正在使用的库提供了一个检查这一点的功能。你需要做的:

if !argparse.IsNilFile(myFile) {
    fmt.Println(myFile)
    myFile.Stat()
}

这是必要的,因为 File 函数返回一个指向空 os.File 对象的指针,并且由于您已将标志标记为可选,如果您不提供标志,该对象将保持为空而不会出现解析错误在命令行。 Stat 显然不能在空的 os.File 对象上工作,这就是你得到无效内存地址的原因。

【讨论】:

    猜你喜欢
    • 2020-03-29
    • 2016-10-12
    • 2011-09-05
    • 2016-08-21
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多