为了账号安全,请及时绑定邮箱和手机立即绑定

Golang:nil 类型的防御性接口

Golang:nil 类型的防御性接口

Go
白猪掌柜的 2021-09-27 18:29:17
我最近发现一些 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

}


查看完整回答
反对 回复 2021-09-27
?
开心每一天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 中,不正确地初始化数据结构是一个编程错误,方法可能会发生恐慌。如果从函数或方法返回类型值,通常还会返回一个错误值,指示是否可以使用第一个值。


查看完整回答
反对 回复 2021-09-27
  • 2 回答
  • 0 关注
  • 293 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信