为何nil对any有效却对[T any]无效?相关矛盾及原理咨询
关于泛型类型返回默认值的疑问解答
一、所谓“矛盾”的本质:混淆了类型参数与any类型
不能为所有类型返回nil。例如,若将int作为T的类型实参,返回nil毫无意义
你觉得这段表述和“nil对any类型有效”有矛盾,核心是没分清类型参数T和any类型的区别:
- any是Go中
interface{}的别名,它本身是一个接口类型,nil是接口类型的合法零值,所以“nil对any有效”是完全正确的。 - 但
[T any]里的T是类型参数,它代表的是任意具体类型(比如int、string、*int这些),而不是any本身。当T被实例化为int时,你需要返回的是int类型的值,而nil根本不是int的合法值(int的零值是0),所以说“不能为所有类型返回nil”是正确的。
二、int是否属于any?
当然属于。any是空接口interface{}的别名,空接口没有任何方法约束,Go中所有类型都默认实现了空接口,所以int、string、自定义结构体等所有类型,都可以赋值给any类型的变量。
三、[T any]的工作机制
[T any]是Go泛型的类型约束,意思是这个泛型的类型参数T可以是任意类型。当你使用这个泛型时,编译器会根据你传入的具体类型,生成对应的具体代码实例:
- 比如调用泛型函数
GetDefault[int](),编译器会生成针对int类型的函数,返回int的零值0; - 调用
GetDefault[*int](),编译器会生成针对指针类型的函数,返回指针的零值nil; - 调用
GetDefault[any](),此时T是any类型,返回的就是接口类型的零值nil。
内容的提问来源于stack exchange,提问作者duckydude20
相关产品推荐
相关产品推荐

