【发布时间】:2020-01-06 21:56:44
【问题描述】:
我有一个经典的 Go nil 界面问题。
我正在尝试将我从nil error 分配的interface{} 断言回error 接口。这句话令人困惑,所以我有一个方便的例子:https://play.golang.com/p/Qhv7197oIE_z
package main
import (
"fmt"
)
func preferredWay(i interface{}) error {
return i.(error)
}
func workAround(i interface{}) error {
if i == nil {
return nil
}
return i.(error)
}
func main() {
var nilErr error
fmt.Println(workAround(nilErr)) // Prints "<nil>" as expected.
fmt.Println(preferredWay(nilErr)) // Panics.
}
输出:
<nil>
panic: interface conversion: interface is nil, not error
goroutine 1 [running]:
main.preferredWay(...)
/tmp/sandbox415300914/prog.go:8
main.main()
/tmp/sandbox415300914/prog.go:21 +0xa0
换句话说,我试图从nil interface{} 向下转换为nil error 接口。如果我知道 interface{} 被分配为 nil error 开始,是否有一种优雅的方法可以做到这一点?
仅供参考,如果这看起来不寻常,那是因为我正在实施一些模拟测试。
【问题讨论】:
-
无论值是否为
nil,在执行type assertion 时,请使用逗号-ok 习惯用法以避免出现恐慌。 (参见文档链接部分的最后一段) -
考虑到我的用例,我不介意恐慌。我将它用于模拟客户端,因此在实施测试时,我可以为模拟客户端方法设置返回值。在这种情况下,恐慌实际上是有帮助的,因为恐慌很快就会失败,这意味着我的测试实施不正确。
标签: go downcast type-assertion go-interface