扩展 Go 中的现有类型
Go 中不直接支持扩展外部包中定义的现有类型。但是,有一些解决方法可以实现类似的结果。
让我们考虑问题中提供的示例:
package util import( "net/http" "github.com/0xor1/gorillaseed/src/server/lib/mux" ) func (r *mux.Route) Subroute(tpl string, h http.Handler) *mux.Route{ return r.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h) } func (r *mux.Router) Subroute(tpl string, h http.Handler) *mux.Route{ return r.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h) }
尝试编译此代码时,遇到错误:“无法定义非本地类型 mux.Router 上的新方法”。这是因为 Go 不允许从外部包直接扩展类型。
解决方法 1:定义包装类型
一种解决方法是定义一个嵌入的包装结构原始类型并提供所需的方法。例如:
type MyRoute struct { *mux.Route } func (r *MyRoute) Subroute(tpl string, h http.Handler) *mux.Route { return r.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h) } type MyRouter struct { *mux.Router } func (r *MyRouter) Subroute(tpl string, h http.Handler) *mux.Route { return r.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h) }
解决方法 2:类型断言
另一个选项是使用类型断言将原始类型转换为interface{},然后再转换为a提供所需方法的自定义类型。例如:
func (r interface{}) Subroute(tpl string, h http.Handler) *mux.Route { switch v := r.(type) { case *mux.Route: return v.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h) case *mux.Router: return v.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h) default: panic("unreachable") } }
注意: 这些解决方法可能会带来额外的复杂性,应谨慎使用。如果可能,最好避免修改外部类型,而是定义自己的类型来包装或扩展您需要的功能。
以上是在不支持直接扩展的情况下如何扩展Go中现有的类型?的详细内容。更多信息请关注PHP中文网其他相关文章!

本文讨论了GO中的自定义类型的创建和使用,包括类型的别名,结构和类型定义。它突出了提高的可读性,类型安全性和代码组织等好处。

本文讨论了GO中的软件包和模块,并解释了它们的差异和用途。软件包组织源代码,而模块管理多个软件包及其依赖项。单词计数:159。

本文讨论了GO中的频道范围,突出了其语法,诸如简化语法和自动终止之类的好处以及安全关闭渠道的最佳实践。它还涵盖了常见的陷阱以避免。

本文讨论了创建和使用渠道进行并发管理的渠道,详细介绍了未掩盖,缓冲和定向渠道。它突出了有效的渠道使用,用于同步,数据共享和避免使用DEA等常见陷阱

本文讨论了GO中的频道,这是Goroutine通信和同步的关键功能。它解释了渠道如何促进并发goroutines之间的安全数据交换和协调


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

SublimeText3汉化版
中文版,非常好用

Dreamweaver CS6
视觉化网页开发工具

记事本++7.3.1
好用且免费的代码编辑器

WebStorm Mac版
好用的JavaScript开发工具