最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • 将这两个函数合二为一的惯用方法

    将这两个函数合二为一的惯用方法

    问题内容

    我有这两个非常相似的功能。它们各自从命名查询参数中解析特定基数/位长度的整数。有两个函数可以处理无符号/有符号整数,需要调用 strconv.ParseUintstrconv.ParseInt

    将这些简化为单个函数的简洁惯用方法是什么?我觉得使用接口(和泛型?)是可行的方法,但我不确定如何继续。

    //////////////////////////////////////////////////////////////////////
    
    func ParseQueryParamUnsigned(name string, base int, bits int, values *url.Values) (uint64, error) {
    
        param := (*values)[name]
    
        if len(param) < 1 {
            return 0, fmt.Errorf("missing parameter %s", name)
        }
    
        if len(param) > 1 {
            return 0, fmt.Errorf("duplicate parameter %s", name)
        }
    
        v, err := strconv.ParseUint(param[0], base, bits)
    
        if err != nil {
            return 0, fmt.Errorf("bad value for '%s' (%s)", name, err.Error())
        }
        return v, nil
    }
    
    //////////////////////////////////////////////////////////////////////
    
    func ParseQueryParamSigned(name string, base int, bits int, values *url.Values) (int64, error) {
    
        param := (*values)[name]
    
        if len(param) < 1 {
            return 0, fmt.Errorf("missing parameter %s", name)
        }
    
        if len(param) > 1 {
            return 0, fmt.Errorf("duplicate parameter %s", name)
        }
    
        v, err := strconv.ParseInt(param[0], base, bits)
    
        if err != nil {
            return 0, fmt.Errorf("bad value for '%s' (%s)", name, err.Error())
        }
        return v, nil
    }

    正确答案

    你可以像这样制作一个通用解析器:

    func ParseQueryParam[T any](name string, values url.Values, parser func(string) (T,error)) (T, error) {
    
        param := values[name]
    
        if len(param) < 1 {
            return 0, fmt.Errorf("missing parameter %s", name)
        }
    
        if len(param) > 1 {
            return 0, fmt.Errorf("duplicate parameter %s", name)
        }
    
        v, err := parser(param[0])
    
        if err != nil {
            return 0, fmt.Errorf("bad value for '%s' (%s)", name, err.Error())
        }
        return v, nil
    }

    并将其用作:

    value, err:=ParseQueryParam[int64]("param",values, func(s string) (int64,error) {
      return strconv.ParseInt(s,10,64)
    })
    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » 将这两个函数合二为一的惯用方法
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 293稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情