是否可以将接口的参数类型留给在 Go 中实现它的接收器?
Posted
技术标签:
【中文标题】是否可以将接口的参数类型留给在 Go 中实现它的接收器?【英文标题】:Is it possible to leave the type of the parameter of an interface to the receiver which implements it in Go? 【发布时间】:2017-11-21 03:01:40 【问题描述】:基本上我想要一个接口,它有一个SetParams
方法,它的声明声明它接收一个参数,以及方法的返回类型,但将参数的返回类型留给接收者。
类似这样的界面:
type ParamsInterface interface
SetParams(<someType>) ParamsInterface
现在XStruct
实现时,参数的类型是XParams
type XStruct struct
params XParams
func (x *XStruct) SetParams(params *XParams) ParamsInterface
x.params = params
return x
但是YStruct
实现的时候,参数的类型是YParams
type YStruct struct
params YParams
func (y *YStruct) SetParams(params *YParams) ParamsInterface
y.params = params
return y
【问题讨论】:
不,这是不可能的。 【参考方案1】:这叫做泛型,你只能使用空接口interface
和
类型转换。
这是关于 go 中泛型的文档:https://docs.google.com/document/d/1vrAy9gMpMoS3uaVphB32uVXX4pi-HnNjkMEgyAHX4N4/edit#。
这也可以帮助你:
How is the empty interface different than a generic?
Why no generics in Go?
这篇文章提出了一些如何在没有泛型的情况下生活的方法:https://appliedgo.net/generics/
在这里您可以找到泛型代码生成器(老实说,这不是最好的主意)https://github.com/cheekybits/genny。
【讨论】:
但是如果我使用空界面,它不会给出来自YParams
和XParams
的自动完成建议吗?
@AyushGupta 我更新了答案,检查最后两个链接
嗯,如果我不使用泛型,我将不得不创建一个 Stub,为 XParams 提供了一个特定的方法
@AyushGupta 不理解你
请注意,Go 中没有类型“强制转换”。你有“类型转换”和“类型断言”,两者完全不同。以上是关于是否可以将接口的参数类型留给在 Go 中实现它的接收器?的主要内容,如果未能解决你的问题,请参考以下文章
[Go] gocron源码阅读-空接口类型interface{}