首页 > 后端开发 > Golang > 如何在不同的 Go 包中实现未导出方法的接口?

如何在不同的 Go 包中实现未导出方法的接口?

DDD
发布: 2024-11-29 17:00:12
原创
186 人浏览过

How Can I Implement an Interface with Unexported Methods in a Different Go Package?

跨包实现具有未导出方法的接口

您尝试通过不导出接口的方法来限制对接口实现细节的访问。虽然这是一种有效的方法,但在单独的包中实现接口时可能会带来挑战。

问题

编译器会引发错误,因为它无法访问未导出的accountingsystem.Adapter 的getInvoice 方法。这是由于 Go 语言的可见性规则导致包无法在其自身范围之外使用未导出的标识符。

可能的解决方案

不幸的是,没有直接的方法在另一个包中实现具有未导出方法的接口。但是,还有其他方法可以实现类似的结果。

使用匿名结构字段

您可以将接口作为匿名字段嵌入单独包中的结构中。虽然这允许结构体满足接口,但也使得您无法定义自己的未导出方法的实现。

注册适配器

更合适的方法是使适配器类型不导出,并在适配器包中提供一个函数,将其注册到主包中。这允许您控制对适配器的访问,同时仍然保持灵活性。

// accountingsystem package
type adapter struct {}

// ... implementation omitted ...

func SetupAdapter() {
    accounting.SetAdapter(adapter{})
}

// main package
func main() {
    accountingsystem.SetupAdapter()
}
登录后复制

通过使用此方法,您可以限制对适配器实现的访问,同时确保接口可以跨包使用。

以上是如何在不同的 Go 包中实现未导出方法的接口?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板