繁体   English   中英

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

[英]How can I write a function that takes either one of many types in go?

我正在尝试一个小项目,并尝试编写以下功能:

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

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

在研究了一些内容并找到了答案之后 (参考了有关超载的文档),我意识到我试图做的事情是非法的。

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

func fatal(reason string)func fatalErr(err error)一起使用将是不雅的,这是需要什么吗? 我是否缺少该语言的其他功能,可以执行自己想做的事情?

最常见的方法是将方法定义为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您也可以查看有效访问,因为它同时包含这两个功能的部分。

使用log.Fatal()代替。 https://golang.org/pkg/log/#Fatal

您可以使用interface {},但不建议使用它,因为这样做会失去类型检查的所有好处。 Go语言作者可以使用interface {},因为他们了解适当的附加测试级别,并检查了使用interface {}时要进行的检查。 当需要类似的东西时,使用内置函数和标准库函数要容易得多(即使对于中级和高级gopher而言)。

Go也没有代数或/和类型。 标准的解决方法是使用指针定义一个and / product类型(例如struct {* string,* error}),并努力确保在任何时间点仅使其中一个字段为非零。

该语言不支持函数重载。 在Golang官方网站上说:

如果方法分派也不需要进行类型匹配,则可以简化方法分派。 其他语言的经验告诉我们,使用具有相同名称但签名不同的多种方法有时会很有用,但在实践中也可能会造成混淆和脆弱。 在Go的类型系统中,仅按名称进行匹配并要求类型一致是一个简化的主要决定。 关于操作员重载,似乎比绝对要求更方便。 同样,没有它,事情会更简单。

https://golang.org/doc/faq#overloading

一种可能的解决方案是定义一个高级函数,该函数对类型进行检查并处理不同类型,类似于您如何重载多个函数。 参见@evanmcdonnal的解决方案中的一个很好的例子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM