Go语言跨包接口问题:方法存在却提示未实现
问题分析与解决方案
你的核心问题在于Go语言的包访问控制规则:types.TxData接口中包含一个首字母小写的方法accessList(),这类方法属于包私有方法,只有在定义它的types包内部才能实现该接口。外部包(你的代码所在包)无法实现这个私有方法,所以无论你怎么调整方法名,都无法让InternalTx满足types.TxData接口的要求。
为什么嵌入types.TxData也没用?
你尝试的嵌入方式:
type TxData struct { types.TxData }
这种组合方式并不能帮你实现私有方法。嵌入的结构体的私有方法依然只能在原包内访问,你的TxData类型依然无法对外暴露accessList()方法,自然还是不满足接口要求。
可行的解决思路
使用
types包提供的现成实现
检查types包是否提供了符合types.TxData接口的公开类型或构造函数(比如types.NewTxData(...)),直接使用这些官方实现,再在其上修改或添加你的自定义逻辑。包装而非实现接口
如果你不需要让InternalTx直接实现types.TxData,可以把它作为一个底层数据结构,包装成一个新类型,只实现你需要的公开方法,或者通过类型断言等方式适配到需要types.TxData的场景(如果允许的话)。修改接口依赖(如果可行)
如果你有权限调整依赖的types包,考虑将accessList()方法改为首字母大写的AccessList(),使其成为公开方法,这样外部包就能实现该接口了。但这只适用于你能控制types包代码的情况。
内容的提问来源于stack exchange,提问作者FeurJak
相关产品推荐
相关产品推荐

