如何编写一个函数,该函数采用 go 中的多种类型之一?

我正在尝试进行一个小项目并尝试编写这些函数:


func fatal(reason string) {

    println(reason)

    os.Exit(1)

}


func fatal(err error) {

    fatal(err.Error())

}

在挖掘了一下并找到这个答案后,它引用了有关重载的文档,我意识到我试图做的事情在 go 中是非法的。


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


func fatal(reason string)和 在一起会感觉不雅func fatalErr(err error),这是需要的吗?我是否错过了语言的一个不同功能,它可以让我做我想做的事?


达令说
浏览 168回答 3
3回答

森林海

最常见的方法是定义方法,func fatal(err interface{})然后进行类型断言或在其主体内使用类型开关来处理每种不同的类型。如果我为你的例子编码,它看起来像这样;func fatal(err interface{}) {     if v, ok := err.(string); ok {         fmt.Println(v)     }     if v, ok := err.(error); ok {          fmt.Println(v.Error())     } else {        // panic ?     }}还; 这是有关类型切换和断言的快速阅读,可能会有所帮助;http://blog.denevell.org/golang-interface-type-assertions-switch.html 您还可以查看 Effective-go,因为它有关于这两个功能的部分。

猛跑小猪

使用 log.Fatal() 代替。https://golang.org/pkg/log/#Fatal您可以使用 interface{},但不推荐使用,因为这样做会失去类型检查的所有好处。Go 作者开始使用 interface{},因为他们了解使用 interface{} 时要进行的适当级别的额外测试和检查。当需要这样的东西时,使用内置和标准库函数要容易得多(即使对于中级和高级地鼠)。Go 也没有代数或/和类型。标准的解决方法是使用指针定义和/产品类型(例如 struct{*string, *error}),并努力确保在任何时间点都只将字段之一设为非 nil。

忽然笑

该语言不支持函数重载。从官方 Golang 网站上说,如果不需要进行类型匹配,则方法分派会得到简化。使用其他语言的经验告诉我们,拥有多种名称相同但签名不同的方法有时很有用,但在实践中也可能令人困惑和脆弱。仅按名称匹配并要求类型的一致性是 Go 类型系统中一个主要的简化决定。关于运算符重载,它似乎更方便而不是绝对要求。同样,没有它,事情会更简单。https://golang.org/doc/faq#overloading一种可能的解决方案是定义一个高级函数,该函数可以类似于重载多个函数的方式来检查和处理不同的类型。请参阅@evanmcdonnal 的解决方案以获取一个很好的示例。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go