以下代码导致SIGSEGV错误。有没有像linters这样的工具可以标记这种糟糕的逻辑?
package main
// Person is ...
type Person interface {
M()
}
func main() {
var i Person
i.M()
}
goint没有检测到这一点。
因为编译器在编译时不知道底层的具体类型i
有什么。考虑这个例子:
func main() {
var i Person
if gender == "woman" {
i = &Woman{}
}
i.M()
}
因为编译器在编译时不知道gender
的值,所以它也不知道&Woman{}
是被分配给i
,还是被保留为Person
接口的零值,即nil
。
这不是一个无效的用法。变量i
绑定到值为nil的接口Person
。
访问字段或调用nil接口值上的方法将导致恐慌,正如所观察到的那样。