关于chatgpt辅助代码质量的那些事

259 阅读3分钟

背景

最近 chatgpt 大火,加上最近几日使用chatgpt辅助阅读一些开源项目的源码参考此文章,体验很好,所以葫芦尝试下使用chatgpt来发现代码中的问题,提高代码质量

操作一波

  • 代码段一

下面是葫芦以前写极验sdk中的一段代码,功能很简单,就是一个http.Get请求

/**
 * 发送GET请求,获取服务器返回结果
 */
func (g *GeeTestLib) httpGet(ctx context.Context, getURL string, params map[string]string) (string, error) {
   q := url.Values{}
   for key, val := range params {
      q.Add(key, val)
   }
   req, err := http.NewRequest(http.MethodGet, getURL, nil)
   if err != nil {
      return "", errors.New("NewRequest fail")
   }
   req.URL.RawQuery = q.Encode()
   res, err := g.Client.Do(ctx, req)
   if err != nil {
      return "", err
   }
   defer res.Body.Close()
   body, err := ioutil.ReadAll(res.Body)
   if err != nil {
      return "", err
   }
   if res.StatusCode == 200 {
      return string(body), nil
   }
   return "", nil
}

直接看下面其实是没什么问题的,下面上AI

这段代码没有显式地设置请求超时时间,可能会导致请求一直处于阻塞状态。可以在http.Client中设置超时时间来避免这种情况的发生。修改后的代码如下:

func (g *GeeTestLib) httpGet(ctx context.Context, getURL string, params map[string]string) (string, error) {
    q := url.Values{}
    for key, val := range params {
        q.Add(key, val)
    }
    req, err := http.NewRequest(http.MethodGet, getURL, nil)
    if err != nil {
        return "", errors.New("NewRequest fail")
    }
    req.URL.RawQuery = q.Encode()

    // 设置超时时间为5秒
    timeout := time.Duration(5 * time.Second)
    g.Client.Timeout = timeout

    res, err := g.Client.Do(ctx, req)
    if err != nil {
        return "", err
    }
    defer res.Body.Close()
    body, err := ioutil.ReadAll(res.Body)
    if err != nil {
        return "", err
    }
    if res.StatusCode == 200 {
        return string(body), nil
    }
    return "", nil
}

是的了,chatgpt给我的代码提出需要增加超时时间的改进,默认设置为5s, 这个时间也是比较合理的,但葫芦仍不够满足

继续提问:还有什么其他的问题吗 或者提高可读性的方法

image.png

是的了,chatgpt 从可读性方面提出了建议,并给出了改进后的代码。不愧是新晋的葫芦代码小助手

  • 代码段二
/**
 * md5 加密
 */
func md5Encode(value string) string {
   h := md5.New()
   h.Write([]byte(value))
   return fmt.Sprintf("%x", h.Sum(nil))
}

说实话,这段代码,葫芦自己都认为没什么问题,毕竟就三行代码,简单的md5加密

上AI

这段代码没有问题,只是可以对其增加错误处理和参数校验。根据之前的建议,以下是修改建议:

  1. 增加错误处理
func md5Encode(value string) (string, error) {
    if value == "" {
        return "", errors.New("value is empty")
    }
    h := md5.New()
    if _, err := h.Write([]byte(value)); err != nil {
        return "", err
    }
    return fmt.Sprintf("%x", h.Sum(nil)), nil
}
  1. 增加参数校验
func md5Encode(value string) (string, error) {
    if value == "" {
        return "", errors.New("value is empty")
    }
    // 校验是否包含敏感信息
    if sensitive.Contains(value) {
        return "", errors.New("value contains sensitive information")
    }
    h := md5.New()
    if _, err := h.Write([]byte(value)); err != nil {
        return "", err
    }
    return fmt.Sprintf("%x", h.Sum(nil)), nil
}

如果需要实现流式读取,可以将 value 参数改为 io.Reader 类型:

func md5Encode(reader io.Reader) (string, error) {
    h := md5.New()
    if _, err := io.Copy(h, reader); err != nil {
        return "", err
    }
    return fmt.Sprintf("%x", h.Sum(nil)), nil
}

其中 io.Copy 函数实现了从 io.Reader 中读取数据并写入到 io.Writer 中的操作。

如果需要使用更安全的哈希算法,可以采用 SHA-256 或 SHA-512 等算法,例如:

func sha512Encode(value string) (string, error) {
    if value == "" {
        return "", errors.New("value is empty")
    }
    h := sha512.New()
    if _, err := h.Write([]byte(value)); err != nil {
        return "", err
    }
    return fmt.Sprintf("%x", h.Sum(nil)), nil
}

虽然没有什么问题,但chatgpt给出了更完善的方案,并给出了相应的修改后的代码

总结

牛Plus

chatgpt的出现让葫芦有危机感了,从之前辅助阅读源码,到提高代码质量这,使用下来都很便捷,正确性极高,这极有可能会淘汰大批的初中级程序员。坚持学习,保持竞争力,避免被取代