golang http请求返回 io.ReadCloser 数据读取和编码转换为utf8 注意事项

在go语言中我们发送一个http请求后, 我们需要通过resp返回体中的Body对象(是一个 io.ReadCloser对象)来对请求返回的数据进行读取。  对于这类Reader的数据读取我们需要先定义一个byte切片, 然后通过循环来对reader中的数据进行读取,这里需要注意的事项有:

1. 在定义用于读取数据的切片时, len需要设置为

2. cap容量可根据要读取的数据的大小来定义,一般为512或者1024或者4096,可稍微加大以提升读取性能, 如: b := make([]byte, 0, 4096)

3. 在循环体内通过 append对切片进行动态扩容(增加切片的cap容量), 如  b = append(b, 0)[:len(b)] 这里先是使用append向切片增加一个0 然后接着在对这个进去进行切片 把刚刚增加的0去除。

4. 数据读取完毕后会返回一个io.EOF的异常,这时一定要使用return或者break终止循环体.

5. readercloser需要再用完后关闭,即增加  defer reader.Close()

6. go中统一数据编码为utf-8 , 如  charset.NewReader(reader, resp.Header.Get("Content-Type")) 可以将获取的内容统一转换为utf-8编码

req, err := http.NewRequest("GET", url, nil)
if err != nil {return nil, err
}
resp, err := http.DefaultClient.Do(req)
if err != nil {return nil, err
}
reader := resp.Body
defer reader.Close()// 将读取到的数据编码转换为utf-8
r, err := charset.NewReader(reader, resp.Header.Get("Content-Type"))
if err != nil {return nil, err
}// 构建一个长度为0  容量为 1024的切片 注意这里的len为0 容量cap为1024 这个容量可根据要读取的数据的大小来调整,以增加性能
b := make([]byte, 0, 1024)
// 循环从reader中读取数据
for {// 这里的 b[len(b):cap(b)] 相当于又从b这个切片中截取 当前数据长度:切片容量 个切片n, err := r.Read(b[len(b):cap(b)])b = b[:len(b)+n] // 这里b[:len(b)+n] 从b生成一个新切片 长度为0:当前数据长度+读取到的长度  如果没有这个语句则无法读取数据if err != nil {  // 读取异常时返回,包括数据读取完毕异常 io.EOFif err == io.EOF { //异常信息为io.EOF 时重置err为nilerr = nil}return b, err}// 数据长度和容量相等,当前容器已经读满了, 使用append来给切片增加容量,大小由append来控制if len(b) == cap(b) {// 这里的这个append操作是为了给b对象增加cap容量, append(b, 0) 向切片添加了一个0,// 后面又对这个增加了0的切片进行切片[:len(b)] 目的就是删除前面增加的这个0b = append(b, 0)[:len(b)]}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/13113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day_5

1. Apache ECharts Apache ECharts 是一款基于 Javascript 的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表 官网地址:https://echarts.apache.org/zh/index.html 入门案例 快速入门&#x…

记录一下-排查免密登录过程

过程记录 2024-05-15 18:15:15 在本地机器上生成新的密钥对: ssh-keygen -t rsa -b 2048 -m PEM -f ~/.ssh/id_rsa_new2024-05-15 18:25:37 将新生成的公钥复制到服务器: ssh-copy-id -i ~/.ssh/id_rsa_new.pub xaykt10.24.17.52024-05-15 18:10:58 执…

企业计算机服务器中了faust勒索病毒如何处理,faust勒索病毒解密恢复

随着网络技术的不断发展与应用,越来越多的企业利用网络走向了数字化办公模式,网络也极大地方便了企业生产运营,大大提高了企业生产效率,但对于众多企业来说,企业的数据安全一直是大家关心的主要话题,保护好…

fastjson2使用

说明:fastjson2是一个性能极致并且简单易用的Java JSON库(官方语),本文介绍在Spring Boot项目中如何使用fastjson2。 创建项目 首先,创建一个Maven项目,引入fastjson2依赖,如下: …

战网国际服注册教程 暴雪战网国际服账号注册一站式教程分享

战网国际版,也即Battle.net环球版,是由暴雪娱乐操刀的全球化游戏交流枢纽,它突破地理限制,拥抱全世界的游戏玩家。与仅限特定地区的版本不同,国际版为玩家开辟了无障碍通道,让他们得以自由探索暴雪庞大游戏…

Python使用fastdfs-client与FastDFS交互

1. 安装(要求Python3.10) pip install fastdfs-client 注:Python3.8和Python3.9可以用这个GitHub - waketzheng/fastdfs-client-python at 1.0.1 2. 使用 from pathlib import Path from fastdfs_client import FastdfsClientclient Fas…

如何使用JMeter测试导入接口/导出接口?

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号:互联网杂货铺,回复1 ,免费获取软件测试全套资料,资料在手,涨薪更快 今天上班,被开发问了一个问题:JM…

opencv 轮廓区域检测

直线检测 void LineDetect(const cv::Mat &binaryImage) {cv::Mat xImage,yImage,binaryImage1,binaryImage2;// 形态学变化,闭操作 先膨胀,再腐蚀 可以填充小洞,填充小的噪点cv::Mat element cv::getStructuringElement(cv::MORPH_RE…

最小质数对-第12届蓝桥杯国赛Python真题解析

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第63讲。 最小质数对&#…

Flutter 中的 Icon 小部件:全面指南

Flutter 中的 Icon 小部件:全面指南 Flutter 提供了多种方式来展示图标,其中 Icon 是最常用的小部件之一。它不仅用于展示简单的图标,还可以与文本、按钮和其他小部件组合使用,以增强用户界面的交互性。本篇文章将详细介绍 Icon …

Windows内核函数 - ANSI_STRING字符串与UNICODE_STRING字符串

DDK不鼓励程序员使用C语言的字符串,主要是因为:标准C的字符串处理函数容易导致缓冲区溢出等错误。如果程序员不对字符串的长度进行检查,很容易导致这个错误,从而导致整个操作系统的崩溃。DDK鼓励程序员使用DDK自定义的字符串&…

基于SSM的“羽毛球馆管理系统”的设计与实现(源码+数据库+文档)

基于SSM的“羽毛球馆管理系统”的设计与实现(源码数据库文档) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统结构图 登录界面 后台用户添加 后台用户管理 球场添加 球场…

英特尔处理器-----ERMS

ERMS,全称为Enhanced REP MOVSB/STOSB,是英特尔处理器的一种特性。它增强了使用REP MOVSB和REP STOSB指令进行内存操作的效率 section .datasrc db Hello,World! ; 源数据dst times 12 db 0 ; 目标缓冲区section .textglobal _start _start:mov es…

vj题单 Color the ball c 差分

题目链接&#xff1a;Problem - 1556 (hdu.edu.cn) 笔者思路&#xff1a;利用一维差分数组进行区间同时1的操作&#xff0c;然后还原为一维前缀和数组 笔者答案&#xff1a; #include<stdio.h> int cut[100010];int main() {long N,a,b,i,k1,j;scanf("%ld",…

Leetcode 3148. Maximum Difference Score in a Grid

Leetcode 3148. Maximum Difference Score in a Grid 1. 解题思路2. 代码实现 题目链接&#xff1a;3148. Maximum Difference Score in a Grid 1. 解题思路 这一题的话算是一个脑筋急转弯的题目吧&#xff0c;本质上就是求各个坐标下其右下方矩阵当中除自己外最大的元素是多…

Linux 第三十三章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

大模型学习笔记九:模型微调

文章目录 一、什么时候需要Fine-Tuning二、用Hugging Face根据电影评论输出来对电影进行情感分类1)安装依赖2)操作流程3)名字解释4)代码导入库和加载模型、加载数据库、加载tokenlizer5)其他相关公共变量赋值(随机种子、标签集评价、标签转token_Id)6)处理数据集:转成…

Altium Designer封装库和元器件符号库下载与导入教程(SnapEDA 、Ultra Librarian、Alldatasheetcn)

1.AD封装库和元器件符号库下载网址 以下是一些全球热门的Altium Designer封装库和元器件符号库下载网址推荐&#xff1a; Altium Content Vault (现称为Altium Manufacturer Part Search)&#xff1a;这是Altium官方提供的元器件库&#xff0c;可以直接在Altium Designer中使用…

免费体验GPT-4o这5大功能,非常好用!

这几天&#xff0c;OpenAI发布了新的GPT版本&#xff0c;GPT-4o&#xff0c;比GPT4更加智能也更快。 据说&#xff0c;GPT-4o在文本、推理和编码智能方面实现了GPT-4 Turbo级别的性能&#xff0c;在多语言、文本、音频和视觉功能方面甚至超过了市面上所有同类产品。 有几个亮点…

数据结构复习指导之图的存储及基本操作

文章目录 图的存储及基本操作 考纲内容 复习提示 1.邻接矩阵法 2.邻接表法 3.十字链表 4.邻接多重表 5.图的基本操作 图的存储及基本操作 图的存储必须要完整、准确地反映顶点集和边集的信息。根据不同图的结构和算法&#xff0c;采用不同的存储方式将对程序的效率产生…