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

Go中的通用编程?

Go中的通用编程?

Go
慕森卡 2021-05-12 17:35:48
我知道Go不支持模板或重载函数,但是我想知道是否有任何方法可以进行某种通用编程?我有很多这样的功能:func (this Document) GetString(name string, default...string) string {    v, ok := this.GetValueFromDb(name)    if !ok {        if len(default) >= 1 {            return default[0]        } else {            return ""        }    }    return v.asString}func (this Document) GetInt(name string, default...int) int {    v, ok := this.GetValueFromDb(name)    if !ok {        if len(default) >= 1 {            return default[0]        } else {            return 0        }    }    return v.asInt}// etc. for many different types没有太多冗余代码,有什么办法可以做到这一点?
查看完整描述

2 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

您最多可以实现interface{}类型的用法,如下所示:


func (this Document) Get(name string, default... interface{}) interface{} {

    v, ok := this.GetValueFromDb(name)

    if !ok {

        if len(default) >= 1 {

            return default[0]

        } else {

            return 0

        }

    }

    return v

}

GetValueFromDb函数也应该调整为返回interface{}值,而不是像现在这样的一些包装器。


然后,在客户端代码中,您可以执行以下操作:


value := document.Get("index", 1).(int)  // Panics when the value is not int

或者


value, ok := document.Get("index", 1).(int)  // ok is false if the value is not int

但是,这将产生一些运行时开销。我最好坚持使用单独的功能,并尝试以某种方式重组代码。


查看完整回答
反对 回复 2021-05-31
  • 2 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

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