跨包使用未导出方法实现接口
在 Go 中,实现接口通常需要定义与接口签名匹配的导出方法。然而,在某些情况下,维持实现的可访问性是不合需要的。本文探讨了在单独的包中使用未导出方法实现接口的可行性。
考虑以下代码片段,其中会计系统的实现 (accountingsystem) 隐藏在未导出类型中:
package accounting import "errors" type IAdapter interface { getInvoice() error } var adapter IAdapter func SetAdapter(a IAdapter) { adapter = a } func GetInvoice() error { if (adapter == nil) { return errors.New("No adapter set!") } return adapter.getInvoice() } package accountingsystem type Adapter struct {} func (a Adapter) getInvoice() error {return nil}
不幸的是,这种方法会产生编译错误,因为会计系统包中未导出的 getInvoice() 方法对会计不可见package.
替代方法
匿名结构字段:
一种解决方案是使用匿名结构字段实现接口在接口的包内。这允许在不暴露实现的情况下满足接口:
package accounting type IAdapter interface { GetInvoice() error } type Adapter struct { IAdapter } func (*Adapter) GetInvoice() error { // Custom implementation }
设置函数:
或者,您可以通过注册创建一个单独的函数来设置适配器未导出的类型作为适配器:
package accounting type IAdapter interface { GetInvoice() error } package accountingsystem type adapter struct {} func (a adapter) GetInvoice() error {return nil} func SetupAdapter() { accounting.SetAdapter(adapter{}) } package main func main() { accountingsystem.SetupAdapter() }
这种方法允许您将适配器的类型保持私有同时将注册过程委托给另一个函数。
以上是Go接口可以跨包使用未导出的方法来实现吗?的详细内容。更多信息请关注PHP中文网其他相关文章!