EasyDSS/EasyNTS通过Golang使用http如何优化响应body未关闭的问题?

我们大多数平台都是用的Golang进行编译的,在很多视频流媒体软件比如EasyDSS、EasyNTS等产品的编译中,经常会出现要使用http接口访问其他服务的接口的情况,一般的编程代码如下:

// 获取 url 数据
func getUrl(url string) ([]byte, error) {
   client := http.Client{
      Timeout: 5 * time.Second,
   }
   resp, err := client.Get(url)
   if err != nil {
      return nil, fmt.Errorf("get url %s error : %s", url, err.Error())
   }
 
   body, err := ioutil.ReadAll(resp.Body)
   if err != nil {
      err = fmt.Errorf("get url %s readbody error %s", url, err.Error())
      return nil, err
   }
   return body, nil
}
 

近期在复查部分产品代码中,发现部分人员写的代码基本为以上类似代码,其中有个非常需要注意的问题,即没有将对应的响应Body关闭,短期不关闭代码不会出现什么问题,但是该种代码会让内存持续增高,导致系统资源的利用率降低。

为了优化这一问题,我们需要添加以下代码:

defer resp.Body.Close()
完整代码如下
// 获取 url 数据
func getUrl(url string) ([]byte, error) {
   client := http.Client{
      Timeout: 5 * time.Second,
   }
   resp, err := client.Get(url)
   if err != nil {
      return nil, fmt.Errorf("get url %s error : %s", url, err.Error())
   }
 
   defer resp.Body.Close()
   body, err := ioutil.ReadAll(resp.Body)
   if err != nil {
      err = fmt.Errorf("get url %s readbody error %s", url, err.Error())
      return nil, err
   }
   return body, nil
}

  

该代码在原本代码上做了优化,进一步适应了用户的使用,节约系统内存资源,如果大家后期在编译中有此类需求,也可以参考以上代码做优化和调整。针对EasyDSS和EasyNTS的新功能开发或者编译,我们也将不断更新。如若还需了解更多TSINGSEE青犀视频相关视频云服务或者其他编译相关内容,欢迎关注。


原文地址:https://www.cnblogs.com/TSINGSEE/p/14889221.html