如何在Golang中读取网络响应内容_Golang 网络响应读取实践

答案:在Golang中读取网络响应需正确处理resp.Body并及时关闭。小数据可用io.ReadAll一次性读取;文本流适合bufio.Scanner逐行处理;JSON响应推荐json.NewDecoder直接解码;无论何种方式都必须defer resp.Body.Close(),并检查StatusCode与设置超时,确保资源释放与程序健壮性。

如何在golang中读取网络响应内容_golang 网络响应读取实践

在Golang中读取网络响应内容,通常是在发送HTTP请求后从*http.Response中获取返回的数据。关键在于正确处理响应体(Body)并及时关闭资源,避免内存泄漏。下面介绍几种常见的实践方式。

使用ioutil.ReadAll一次性读取

最简单的方式是使用ioutil.ReadAll将响应体全部读入内存。适用于响应数据较小的场景。

注意:Go 1.16之后推荐使用io.ReadAll替代ioutil.ReadAll。大响应体可能导致内存占用过高。

示例代码:

resp, err := http.Get("https://api.example.com/data")if err != nil {    log.Fatal(err)}defer resp.Body.Close()

body, err := io.ReadAll(resp.Body)if err != nil {log.Fatal(err)}fmt.Println(string(body))

使用bufio逐行读取

当响应是文本格式(如日志流、JSON行等),可使用bufio.Scanner逐行处理,节省内存。

立即学习“go语言免费学习笔记(深入)”;

适合处理大型文本响应或流式数据。

示例:

resp, err := http.Get("https://api.example.com/stream")if err != nil {    log.Fatal(err)}defer resp.Body.Close()

scanner := bufio.NewScanner(resp.Body)for scanner.Scan() {fmt.Println(scanner.Text())}if err := scanner.Err(); err != nil {log.Fatal(err)}

直接解码JSON响应

如果响应是JSON格式,建议直接用json.NewDecoder解码,无需先读字符串。

这种方式更高效,尤其适合结构化数据。

示例:

type User struct {    Name string `json:"name"`    Age  int    `json:"age"`}

resp, err := http.Get("https://www.php.cn/link/d3edfaac7b134307771e928cc3293131")if err != nil {log.Fatal(err)}defer resp.Body.Close()

var user Userif err := json.NewDecoder(resp.Body).Decode(&user); err != nil {log.Fatal(err)}fmt.Printf("%+vn", user)

处理错误与资源释放

无论采用哪种读取方式,都必须确保resp.Body.Close()被调用,防止连接未释放。

常见注意事项:

即使请求失败(如404、500),只要返回了*http.Response,就需关闭Body。网络错误或超时应设置http.Client的超时时间。检查resp.StatusCode判断是否为预期响应。

增强版请求示例:

client := &http.Client{Timeout: 10 * time.Second}req, _ := http.NewRequest("GET", "https://api.example.com/data", nil)

resp, err := client.Do(req)if err != nil {log.Fatal(err)}defer resp.Body.Close()

if resp.StatusCode != http.StatusOK {log.Fatalf("HTTP %d", resp.StatusCode)}

body, _ := io.ReadAll(resp.Body)fmt.Println(string(body))

基本上就这些。根据响应大小和数据格式选择合适的读取方式,始终记得关闭Body,保证程序健壮性。

以上就是如何在Golang中读取网络响应内容_Golang 网络响应读取实践的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1425244.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月16日 19:24:59
下一篇 2025年12月16日 19:25:10

相关推荐

  • C#的Compression命名空间如何压缩数据?

    c#的system.io.compression命名空间提供了deflatestream、gzipstream和brotlistream用于数据压缩与解压缩。1. gzipstream因兼容性好、含校验和,适用于文件归档和http压缩;2. deflatestream仅含纯压缩数据,适合内部通信或自…

    2025年12月17日
    000
  • C#的FileStream类如何读写文件?

    filestream是c#中用于直接操作文件字节流的类,适用于处理二进制文件、需要精确控制文件指针或性能敏感的大文件场景;2. 使用时必须通过using语句确保资源释放,并捕获ioexception、unauthorizedaccessexception等异常以增强健壮性;3. 优化大文件处理时可设…

    2025年12月17日
    000
  • c语言typedef的意思

    C语言中 typedef 关键词用于创建现有数据类型的别名,提高代码可读性、重用性和维护性。它提供语法:typedef ;例如,将 8 位无符号整数类型定义为 byte:typedef unsigned char byte。 c语言中的typedef typedef 是一个关键字,用于定义一种新的数…

    2025年12月17日
    000
  • c语言中double是啥意思

    C语言中,double用于声明双精度浮点数变量,具有高精度、宽范围的特点,占用8字节内存。 C 语言中 double 的含义 在 C 语言中,double 是一个关键字,用于声明双精度浮点数变量。双精度浮点数用于表示比 float 类型占用更多位数的数值,通常用于高精度计算或科学计算。 double…

    2025年12月17日
    000
  • c语言中double的含义

    在C语言中,double数据类型是一种双精度浮点类型,用于表示实数,范围约为-1.7976931348623157e+308至1.7976931348623157e+308,精度约为15-17位小数。 C语言中double数据类型 什么是double数据类型? 在C语言中,double数据类型是一种…

    2025年12月17日
    000
  • double在c语言中的意义

    在 C 语言中,double 是用于表示双精度浮点数的数据类型,比 float 类型精度更高,用于处理更大数值范围或更精确的计算。它可以储存高精度数值、表示大型浮点数和小数,范围从 -1.7976931348623157e308 到 1.7976931348623157e308,精度约为 15 位有…

    2025年12月17日
    000
  • sizeof在c语言中是什么意思

    sizeof 是 C 语言中用于返回给定数据类型或变量占用的内存字节数的运算符。它有如下用途:确定数据类型大小动态内存分配获取结构和联合体大小确保跨平台兼容性 sizeof:C 语言中的数据类型大小运算符 什么是 sizeof? sizeof 是 C 语言中的运算符,它返回其操作数数据类型在内存中占…

    2025年12月17日
    000
  • c语言中double和float的区别

    精度和范围更高、内存占用和计算时间更多的浮点数据类型是 double 型数据。 C 语言中 double 和 float 的区别 在 C 语言中,double 和 float 是两种浮点数据类型。它们的区别主要体现在以下几个方面: 1. 精度和范围 精度: double 型数据的精度比 float …

    2025年12月17日
    000
  • c语言中double和float的用法

    C语言中,double(精度为15-17位小数,占用8个字节内存)和小数(精度为6-7位小数,占用4个字节内存)用于表示浮点数。选择哪种类型取决于对精度的要求:科学计算建议用double,图形或用户界面等精度要求不高的程序建议用float。需要注意,double和float转换使用strtod()和…

    2025年12月17日
    000
  • .NetCore如何获取Json和Xml格式的配置信息讲解

    本篇将和大家分享的是如何获取json和xml格式的配置信息,主要介绍的是configuration扩展方法的使用,对.netcore 获取json和xml格式的配置信息的相关知识,感兴趣的朋友一起看看吧 本篇将和大家分享的是:如何获取Json和Xml格式的配置信息,主要介绍的是Configurati…

    2025年12月17日 好文分享
    000
  • 关于json result的实例代码

    public jsonresult jsondata()        {            httpcontext.response.appendheader(“access-control-allow-origin”, “*”);       …

    好文分享 2025年12月17日
    000
  • C# 将 Json 解析成 DateTable

    c# 将 json 解析成 datetable  #region 将 Json 解析成 DateTable /// /// 将 Json 解析成 DateTable。 /// Json 数据格式如: /// {table:[{column1:1,column2:2,column3:3},{colum…

    2025年12月17日
    000
  • C# Json 序列化与反序列化一

    public class JsonSerializer { /// /// json序列化 /// /// /// /// public static string JsonStringSerializer(T t) { DataContractJsonSerializer ser = new Da…

    好文分享 2025年12月17日
    000
  • C# web api返回类型设置为json的两种方法

    web api写api接口时默认返回的是把你的对象序列化后以xml形式返回,那么怎样才能让其返回为json呢,下面就介绍两种方法: 方法一:(改配置法)  找到global.asax文件,在application_start()方法中添加一句:  GlobalConfiguration.Config…

    好文分享 2025年12月17日
    000
  • 什么是XML Infoset

    XML Infoset是W3C定义的抽象数据模型,用于标准化XML文档解析后的信息表示。它定义了11种信息项(如文档、元素、属性等),屏蔽物理格式差异,确保不同解析器对XML内容的理解一致。DOM和SAX等解析技术均基于Infoset构建:DOM将其具象化为树结构,SAX则通过事件流式暴露信息项。I…

    2025年12月17日
    000
  • XML中如何获取根节点属性_XML获取根节点属性的操作步骤

    XML根节点有且仅有一个,可包含属性;2. Python用ET.parse解析,root.get(“属性名”)获取属性值;3. JavaScript用DOMParser解析,xmlDoc.documentElement获取根节点,getAttribute读取属性;4. Jav…

    2025年12月17日
    000
  • XML中如何解压XML字符串_XML解压XML字符串的操作方法

    先解压再解析XML。C#用GZipStream解压字节流并转字符串,Java用GZIPInputStream或InflaterInputStream读取压缩数据,结合StreamReader或BufferedReader还原为明文XML后,交由XDocument或DocumentBuilder解析;…

    2025年12月17日
    000
  • XML中如何生成XML文档_XML生成XML文档的详细操作方法

    使用Python、Java和JavaScript均可生成XML文档。Python通过ElementTree创建根节点与子节点并写入文件;Java利用DOM API构建元素层级并转换输出;JavaScript借助xmlbuilder库链式生成结构化XML,均需注意命名规范及特殊字符处理。 在程序开发中…

    2025年12月17日
    000
  • XML中如何遍历所有节点_XML遍历节点的操作方法与实践

    使用Python的ElementTree和Java的DOM均可递归遍历XML所有节点,前者通过iter()方法访问每个元素,后者利用NodeList递归处理子节点,实现信息提取或修改。 在处理XML数据时,经常需要遍历所有节点以提取信息或进行修改。实现这一目标的方法取决于使用的编程语言和解析库,但核…

    2025年12月17日
    000
  • 如何优化XML网络传输

    优化XML网络传输需从压缩、结构精简和协议升级入手。首先,Gzip压缩可减少60%-80%数据量;其次,简化标签名、去除冗余命名空间与空白字符能降低XML“体重”;再者,采用SAX或XMLPullParser流式解析替代DOM,可显著提升大文件处理效率;同时,预编译XPath/XSLT、缓存解析结果…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信