Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
346 views
in Technique[技术] by (71.8m points)

_ Error = (*_Error)(nil) 这个是怎么理解?

在GitHub上看到的代码,如下:

var (

_ Error = (*_Error)(nil)

_ fmt.Stringer = (*_Error)(nil)

)

说明:
Error是一个interface
_Error是一个struct

判断struct是否实现了interface应该是这个写法吧
var _ Error = (*_Error){}

加(nil)是什么意思呢??


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

这个一个强制类型转换语法检测是否实现接口的功能,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接口就没事,如果没有实现在编译时期就会报错,实现编译期间检测接口是否实现。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...