3 回答
TA贡献2011条经验 获得超2个赞
最常见的方法是定义方法,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,因为它有关于这两个功能的部分。
TA贡献1858条经验 获得超8个赞
使用 log.Fatal() 代替。https://golang.org/pkg/log/#Fatal
您可以使用 interface{},但不推荐使用,因为这样做会失去类型检查的所有好处。Go 作者开始使用 interface{},因为他们了解使用 interface{} 时要进行的适当级别的额外测试和检查。当需要这样的东西时,使用内置和标准库函数要容易得多(即使对于中级和高级地鼠)。
Go 也没有代数或/和类型。标准的解决方法是使用指针定义和/产品类型(例如 struct{*string, *error}),并努力确保在任何时间点都只将字段之一设为非 nil。
TA贡献1806条经验 获得超5个赞
该语言不支持函数重载。从官方 Golang 网站上说,
如果不需要进行类型匹配,则方法分派会得到简化。使用其他语言的经验告诉我们,拥有多种名称相同但签名不同的方法有时很有用,但在实践中也可能令人困惑和脆弱。仅按名称匹配并要求类型的一致性是 Go 类型系统中一个主要的简化决定。关于运算符重载,它似乎更方便而不是绝对要求。同样,没有它,事情会更简单。
https://golang.org/doc/faq#overloading
一种可能的解决方案是定义一个高级函数,该函数可以类似于重载多个函数的方式来检查和处理不同的类型。请参阅@evanmcdonnal 的解决方案以获取一个很好的示例。
- 3 回答
- 0 关注
- 167 浏览
添加回答
举报