我最近在一个流行的编程论坛上读到,Go支持一些“无类型”值 - 特别是,Go的空值/底部类型。我对Go的经验相当有限,在这个论坛上发表的一个声明让我措手不及 - 也就是说,用Go写作是非法的。nilx := nil
果然,带有该行的玩具Go程序无法编译,编译器错误清楚地表明论坛中的注释已签出:不允许声明和分配变量。这似乎是一个奇怪的限制,但事情变得更加奇怪。nil
Go 中的一个常见习语是通过从函数返回元组来返回部分错误。像这样:
func might_error() (int, error) {
return 1, nil
}
func main() int {
x, err := might_error()
if err != nil {
panic("err was not nil!")
}
return x
}
据我所知,这至少有两个不一致之处:
首先,尽管在纸面上是无类型的,但它采用类型(通过实现与Go的鸭子类型相结合的接口),以符合 的返回类型签名。nil
error
Error
might_error
其次,它似乎被用于以前非法的声明和分配,并且在(至少在可比较的语言中)可以被视为constexpr的情况下。nil
main
might_error
更奇怪的是,用静止的错误替换掉,使用未打字的nil
!x, err := might_error()
x, err := 1, nil
我目前的想法是,在函数的类型签名需要它的情况下,接口被注入到一个特定的实例中,这意味着它不再是非类型化的,而是在该特定实例的生命周期内成为类型化的,但我完全不确定这是正确的,因为它似乎是一个奇怪的设计选择,因为它本质上不能清楚地推广。Error
nil
nil
nil
nil
是什么促使了这些设计选择?为什么是非类型化而不是让它成为一个正确的空类型,除非在方便的时候,在这一点上它成为一个实现接口的类型化值(据我所知)?nil
Error
猛跑小猪
慕哥6287543
相关分类