猿问

Golang:nil 类型的防御性接口

我最近发现一些 go 代码正在测试框架中运行,其中有一些未初始化的变量。


这会导致恐慌,它在顶部有一个包含一些 c 代码的堆栈跟踪。


在函数中,有没有一种方法可以简明地检测作为实现成员引用的结构是否为零?IE


func ( d *Dog ) canBark Bool {

      //if d is nil, cryptic exception is thrown.

      //is there a way to defend against this?

}

抛出的错误是


panic: runtime error: invalid memory address or nil pointer dereference 

[signal 0xb code=0x1 addr=0x0 pc=0x4ec83a] 

goroutine 16 [running]:   

runtime.panic(0x9b7400, 0xf7ddf3) 

似乎在 go 中,这种较低级别的错误应该很少发生,也许根本不会发生......


可能有一种 Golang 方法来处理 nil 引用,它不会用 if/else 逻辑使代码过于混乱。例如,在 java 中,您可以将大代码段包装在空指针异常处理程序中。


白猪掌柜的
浏览 294回答 2
2回答

临摹微笑

你可以检查 nil 然后做任何事情:func (d *Dog) canBark bool {    if d == nil {        // do something useful, maybe? Like log        // a stack trace for debugging later        log.Print("Attempt to bark a nil dog!")        return false    }    // do the regular things}

开心每一天1111

当然:func ( d *Dog ) bool {    if d ==  nil {        // a nil dog can't bark        return false    }}完全可以在 nil 结构上使用方法。然而,一个 nil 接口是另一回事。您无法对此进行防御,因为没有可以调用方法的类型。type Barker interface {    CanBark() bool}var dog Barker//panicsdog.CanBark()在 go 中,不正确地初始化数据结构是一个编程错误,方法可能会发生恐慌。如果从函数或方法返回类型值,通常还会返回一个错误值,指示是否可以使用第一个值。
随时随地看视频慕课网APP

相关分类

Go
我要回答