为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
达令说 2021-11-29 16:55:49
我正在尝试进行一个小项目并尝试编写这些函数: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),这是需要的吗?我是否错过了语言的一个不同功能,它可以让我做我想做的事?
查看完整描述

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,因为它有关于这两个功能的部分。


查看完整回答
反对 回复 2021-11-29
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

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

您可以使用 interface{},但不推荐使用,因为这样做会失去类型检查的所有好处。Go 作者开始使用 interface{},因为他们了解使用 interface{} 时要进行的适当级别的额外测试和检查。当需要这样的东西时,使用内置和标准库函数要容易得多(即使对于中级和高级地鼠)。

Go 也没有代数或/和类型。标准的解决方法是使用指针定义和/产品类型(例如 struct{*string, *error}),并努力确保在任何时间点都只将字段之一设为非 nil。


查看完整回答
反对 回复 2021-11-29
?
忽然笑

TA贡献1806条经验 获得超5个赞

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

如果不需要进行类型匹配,则方法分派会得到简化。使用其他语言的经验告诉我们,拥有多种名称相同但签名不同的方法有时很有用,但在实践中也可能令人困惑和脆弱。仅按名称匹配并要求类型的一致性是 Go 类型系统中一个主要的简化决定。关于运算符重载,它似乎更方便而不是绝对要求。同样,没有它,事情会更简单。

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

一种可能的解决方案是定义一个高级函数,该函数可以类似于重载多个函数的方式来检查和处理不同的类型。请参阅@evanmcdonnal 的解决方案以获取一个很好的示例。


查看完整回答
反对 回复 2021-11-29
  • 3 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信