我试图去寻找一个小项目并尝试编写这些功能:
func fatal(reason string) {
println(reason)
os.Exit(1)
}
func fatal(err error) {
fatal(err.Error())
}
在挖掘了一下并发现引用this answer的the docs on overloading后,我意识到我试图做的事情是非法的。
我想要的是一个简单的api,它允许我用字符串或错误调用致命错误以简化我的逻辑。我如何实现这一目标或类似目标?
让func fatal(reason string)
与func fatalErr(err error)
一起感觉不合适,是否需要什么?我是否错过了允许我做我想做的语言的不同功能?
答案 0 :(得分:3)
执行此操作的最常见方法是将方法定义为{"_id" : 1, orgId: 1}
,然后键入断言或在其正文中使用类型开关来处理每种不同类型。如果我为你的例子编码,它看起来就像这样;
func fatal(err interface{})
也;这里有一个关于类型开关和断言的快速阅读,可能会有所帮助; http://blog.denevell.org/golang-interface-type-assertions-switch.html 您还可以查看有效的内容,因为它包含两个功能的部分。
答案 1 :(得分:2)
使用log.Fatal()代替。 https://golang.org/pkg/log/#Fatal
您可以使用interface {}但不推荐使用它,因为在执行此操作时会丢失类型检查的所有好处。 Go作者可以使用interface {},因为他们了解使用interface {}时要进行的额外测试和检查的适当级别。当需要这样的东西时,使用内置和标准库函数会更容易(即使是中级和高级gophers)。
Go也没有代数或/和类型。标准的解决方法是使用指针定义一个和/ product类型(例如struct {* string,* error}),并努力确保在任何时间点都只使一个字段为非零。
答案 2 :(得分:1)
语言不支持函数重载。来自官方的Golang网站,它说,
如果方法调度也不需要进行类型匹配,则会简化方法调度。使用其他语言的经验告诉我们,使用具有相同名称但签名不同的各种方法偶尔会有用,但在实践中它也可能令人困惑和脆弱。仅按名称匹配并要求在类型中保持一致性是Go类型系统中的主要简化决策。 关于运算符重载,它似乎比绝对要求更方便。如果没有它,事情会更简单。
https://golang.org/doc/faq#overloading
一个可能的解决方案是定义一个高级函数,类型检查和处理不同的类型,类似于如何重载多个函数。请参阅@ evanmcdonnal&#39的解决方案,以获得一个很好的例子。