Golang:nil类型的防御性接口

时间:2015-04-08 21:06:58

标签: exception go try-catch null

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

这会导致恐慌,其中堆栈跟踪包含顶部的一些c代码。

在函数中是否有一种方法可以简洁地检测作为执行成员引用的结构是否为零?即

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) 

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

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

2 个答案:

答案 0 :(得分:4)

您可以检查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
}

答案 1 :(得分:2)

不确定

func ( d *Dog ) bool {
    if d ==  nil {
        // a nil dog can't bark
        return false
    }
}

完全可以在nil结构上使用方法。然而,一个零接口是另一个故事。你无法防范,因为没有类型可以调用方法。

type Barker interface {
    CanBark() bool
}

var dog Barker
//panics
dog.CanBark()

在go中,不正确地初始化数据结构是一个编程错误,并且方法可能会出现恐慌。如果从函数或方法返回类型值,通常会返回错误值,指示是否可以使用第一个值。