如何编写一个可以使用多种类型之一的函数?

时间:2015-12-22 00:33:59

标签: go types

我试图去寻找一个小项目并尝试编写这些功能:

func fatal(reason string) {
    println(reason)
    os.Exit(1)
}

func fatal(err error) {
    fatal(err.Error())
}

在挖掘了一下并发现引用this answerthe docs on overloading后,我意识到我试图做的事情是非法的。

我想要的是一个简单的api,它允许我用字符串或错误调用致命错误以简化我的逻辑。我如何实现这一目标或类似目标?

func fatal(reason string)func fatalErr(err error)一起感觉不合适,是否需要什么?我是否错过了允许我做我想做的语言的不同功能?

3 个答案:

答案 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的解决方案,以获得一个很好的例子。