[英]How can I write a function in Golang which takes multiple types as a parameter?
[英]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.