在GitHub上看到的代码,如下:
var ( _ Error = (*_Error)(nil) _ fmt.Stringer = (*_Error)(nil) )
说明:Error是一个interface_Error是一个struct
Error是一个interface
_Error是一个struct
判断struct是否实现了interface应该是这个写法吧var _ Error = (*_Error){}
var _ Error = (*_Error){}
加(nil)是什么意思呢??
加(nil)
这个一个强制类型转换语法检测是否实现接口的功能,nil就是空指针地址就是0,我的这篇文章有介绍强制类型转换 https://ostack.cn/a/1190000022255009#item-3-4
一个变量是具有类型和地址两个属性,强制类型转换只修改了类型,但是地址是原来那个(例如是nil),这样的转换的变量不用分配地址。
例如下列代码:
var _ Context = (*ContextBase)(nil)
nil的类型是nil地址值为0,利用强制类型转换成了*ContextBase,返回的变量就是类型为*ContextBase地址值为0,然后Context=xx赋值如果xx实现了Context接口就没事,如果没有实现在编译时期就会报错,实现编译期间检测接口是否实现。
Context=xx
1.4m articles
1.4m replys
5 comments
56.7k users