账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Golang如何在扩展原有类型的情况下,保留原有类型的方法
    23
    0

    目前遇到了一个需求,需要对net包中的url.Values进行扩展,增添不同的方法,扩展成几个不同的类型。以下是url.Values的部分源码:

    type Values map[string][]string
    
    func (v Values) Set(key, value string) {
        v[key] = []string{value}
    }
    ...

    我的想法是用url.Values这个类型,给其添上不同的方法,形成不同的类型,同时保留其原有的方法,最后需要在类型检查时能被识别为新的类型。

    但好像Go的扩展方法并不能完美实现这个需求。

    首先是类型声明:

    type Params url.Values

    这种方式不能继承原有类型的方法,Pass。

    然后是类型别名:

    type Params=url.Values

    这种方式因为只是别名,在做类型检查时又无法与url.Values区分开,Pass。

    最后是结构体组合:

    type Params struct {
        url.Values
    }

    这种方式能够继承原方法,也能被识别为不同的类型。但是新类型声明的时候却较为麻烦,需要以如下的方式:

    params := Params{url.Values{
        "key": {"value"},
    }}

    或者

    params := Params{}
    params.Values = url.Values{
        "key": {"value"},
    }

    这样多一层url.Values的方式就与我一开始为了简洁而进行封装的想法有点背道而驰了。

    由于之前是做Python的,不知道这个问题在Go中有更好的解决办法吗?或者说以Go的思维来说,应该采取其他的方式?

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 孤傲白狼 普通会员 1楼
      502 Bad Gateway

      502 Bad Gateway


      nginx
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部