将功能扩展到其他包中定义的现有类型是软件开发中的常见需求。在 Go 中,类型被分类为本地或非本地,尝试向非本地类型添加新方法可能具有挑战性。本文探讨了实现此目标的不同方法。
提供的代码片段演示了从 github.com/0xor1/gorillaseed 向 Route 和 Router 类型添加实用方法的尝试/src/server/lib/mux 包。但是,编译器会报告错误,指出不允许在非本地类型上定义新方法。
为了克服此限制,Go 提供了几种技术:
1.使用匿名字段定义新结构
一种方法是创建一个新的结构类型,将原始类型嵌入为匿名字段。例如:
type MyRoute struct { *mux.Route }
这允许您在 MyRoute 上定义继承对 mux.Route 字段的访问权限的自定义方法。
2.嵌入原始类型
或者,您可以将原始类型显式嵌入到新的结构类型中:
type MyRouter struct { mux.Router }
这种方法提供了继承关系的更明确的定义,而仍然使您能够扩展嵌入类型的功能。
3.包装原始类型
另一个选项是创建一个包装器类型,该包装器类型实现所需的方法,同时将底层功能委托给原始类型。例如:
type MyRouter struct { Router mux.Router } func (r *MyRouter) F() { // Do something r.Router.G() }
这种方法提供了灵活性,允许您自定义包装类型的行为,同时仍然利用原始功能。
扩展非Go 中的本地类型需要巧妙地使用结构嵌入或包装类型。通过利用这些技术,您可以使用自定义功能增强现有类型,而不会违反 Go 语言的封装原则。
以上是如何扩展 Go 中非本地类型的功能?的详细内容。更多信息请关注PHP中文网其他相关文章!