Go结构体省略接口类型字段名的疑问:为何可直接调用接口方法?
问题解答
为什么TokenParser可以直接调用GetKeys()?
这是Go语言的字段方法提升特性:当你在结构体中嵌入一个接口类型(这里KeyRepository作为匿名字段存在),该接口的所有方法会被自动提升为结构体的方法。所以TokenParser的实例p可以直接调用GetKeys(),底层实际是调用嵌入的KeyRepository字段的对应方法,和写p.KeyRepository.GetKeys()效果完全一致。
省略字段名且字段类型为接口时,是实现接口还是声明字段?
这是声明一个匿名字段,而非实现接口:
- 你只是把
KeyRepository接口类型作为TokenParser的一个匿名字段,需要在创建实例时(比如NewTokenParser函数中)传入该接口的具体实现,这个字段才会有实际的方法逻辑。 - 如果要让
TokenParser实现KeyRepository接口,需要为TokenParser显式编写GetKeys()方法,而非靠嵌入接口字段。嵌入接口字段只是复用了已有实现的方法,本质是结构体持有了一个接口实例,而非自身实现了接口(除非你后续覆盖该方法)。
举个例子:如果后续给TokenParser自己写一个GetKeys()方法,调用p.GetKeys()时会优先执行结构体自身的方法,而非嵌入字段的方法。
内容的提问来源于stack exchange,提问作者codewarrior
相关产品推荐
相关产品推荐

