go的包中var _ io.ReadCloser = (*A)(nil)
有什么作用?
go的包中var _ io.ReadCloser = (*A)(nil)
有什么作用?
这是一个关于 Go 语言的问题,涉及到包的初始化以及空指针的使用。
var _ io.ReadCloser = (*A)(nil)
这个语句在 Go 语言中的作用主要有两个:
_
是一个空白标识符,用于忽略变量名。然后,(*A)(nil)
是一个类型转换,它把 nil
(空指针)转换成类型 *A
。虽然这个转换的结果是 nil
,但它会使得 *A
这个类型被初始化,这样可以保证在包加载的时候,这个类型被正确地注册到 Go 的类型系统中。type
关键字定义的类型)。当一个类型被定义的时候,它需要被注册到 Go 的类型系统中。(*A)(nil)
的作用就是使得 *A
这个类型被注册。需要注意的是,这个语句并不会创建一个可用的 io.ReadCloser
对象。这个语句只是创建了一个 io.ReadCloser
类型的空指针,并且把这个空指针赋值给了 _
。这个空指针并不能被用于实际的读取操作,因为它没有指向任何具体的对象。
另外,这个语句也不会阻止 A
类型的实例被创建。如果你想阻止 A
类型的实例被创建,你需要定义一个私有构造函数(一个只能从内部访问的构造函数),并且不提供公开的构造函数。
15 回答8.4k 阅读
7 回答5.3k 阅读
6 回答6.9k 阅读✓ 已解决
4 回答4.4k 阅读✓ 已解决
4 回答4k 阅读
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
我找原因了: 为了编译器在编译期间进行断言,GO编译期间会进行死码消除,这种代码不会对正式环境造成影响,但是可以在编译期间检查出我们要实现某些接口时候,如果没有实现的问题。因为GO的interface实现不是强制性检测;
具体可以看:interface-合理性验证