我最近发现一些 go 代码正在测试框架中运行,其中有一些未初始化的变量。这会导致恐慌,它在顶部有一个包含一些 c 代码的堆栈跟踪。在函数中,有没有一种方法可以简明地检测作为实现成员引用的结构是否为零?IEfunc ( 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 中,您可以将大代码段包装在空指针异常处理程序中。
2 回答
临摹微笑
TA贡献1982条经验 获得超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
TA贡献1836条经验 获得超13个赞
当然:
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
//panics
dog.CanBark()
在 go 中,不正确地初始化数据结构是一个编程错误,方法可能会发生恐慌。如果从函数或方法返回类型值,通常还会返回一个错误值,指示是否可以使用第一个值。
- 2 回答
- 0 关注
- 293 浏览
添加回答
举报
0/150
提交
取消