跨包实现具有未导出方法的接口
您尝试通过不导出接口的方法来限制对接口实现细节的访问。虽然这是一种有效的方法,但在单独的包中实现接口时可能会带来挑战。
问题
编译器会引发错误,因为它无法访问未导出的accountingsystem.Adapter 的getInvoice 方法。这是由于 Go 语言的可见性规则导致包无法在其自身范围之外使用未导出的标识符。
可能的解决方案
不幸的是,没有直接的方法在另一个包中实现具有未导出方法的接口。但是,还有其他方法可以实现类似的结果。
使用匿名结构字段
您可以将接口作为匿名字段嵌入单独包中的结构中。虽然这允许结构体满足接口,但也使得您无法定义自己的未导出方法的实现。
注册适配器
更合适的方法是使适配器类型不导出,并在适配器包中提供一个函数,将其注册到主包中。这允许您控制对适配器的访问,同时仍然保持灵活性。
// accountingsystem package type adapter struct {} // ... implementation omitted ... func SetupAdapter() { accounting.SetAdapter(adapter{}) } // main package func main() { accountingsystem.SetupAdapter() }
通过使用此方法,您可以限制对适配器实现的访问,同时确保接口可以跨包使用。
以上是如何在不同的 Go 包中实现未导出方法的接口?的详细内容。更多信息请关注PHP中文网其他相关文章!