返回顶部
首页 > 资讯 > 精选 >怎么解决Go语言的read读取错误
  • 811
分享到

怎么解决Go语言的read读取错误

2023-06-16 10:06:10 811人浏览 安东尼
摘要

这篇文章主要讲解了“怎么解决Go语言的read读取错误”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么解决Go语言的read读取错误”吧!情景描述代码中需要实现一个客户端与服务器的数据重传

这篇文章主要讲解了“怎么解决Go语言的read读取错误”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么解决Go语言的read读取错误”吧!

情景描述

代码中需要实现一个客户端与服务器的数据重传机制,通过write写数据给服务器,read读取服务器返回。一旦中途发生错误,每隔1s就尝试重新写读数据。当超过上下文时间,重传失败。重传实现代码retry如下。

func retry(ctx context.Context) (data string, err error) {  LOOP:  for i:=1;;i++{   err = write()   if err == nil{    res, err := read()    if err == nil{     data = string(res)     return data, err    }   }    log.Printf("change data failed, err: %v, retry times : %d\n", err, i)    select {   case <-ctx.Done():    log.Printf("retry failed")    break LOOP   case <-time.After(1 * time.Second):   }  }  return "", err }

读写服务器数据函数和调用重传代码mock如下。

func write() error {  return nil }  func read() ([]byte, error) {  return []byte("hello world"), errors.New("this is a error") }  func main() {  ctx,_ := context.WithTimeout(context.Background(),5*time.Second)  _, _ = retry(ctx)  time.Sleep(10*time.Second) }

write返回err为nil,read有非nil返回。这种情况下,日志输出如下。

2020/07/05 09:30:57 change data failed, err: <nil>, retry times : 1 2020/07/05 09:30:58 change data failed, err: <nil>, retry times : 2 2020/07/05 09:30:59 change data failed, err: <nil>, retry times : 3 2020/07/05 09:31:00 change data failed, err: <nil>, retry times : 4 2020/07/05 09:31:01 change data failed, err: <nil>, retry times : 5 2020/07/05 09:31:02 retry failed

原因分析

可以看到的是,如预想的一样:当发生错误时,就重新尝试write和read。即重传机制生效。但是,日志中为何err会为nil,read方法的错误返回被吞掉了?

经过排查,发现原因就在于&mdash;&mdash;Go语法糖:=(短变量声明)的不当使用。

err = write()  if err == nil{   res, err := read()   if err == nil{    data = string(res)    return data, err   }  }   log.Printf("change data failed, err: %v, retry times : %d\n", err, i)

在retry中,err是已被声明的变量类型error。由于read返回的是两个变量,故小菜刀在此利用短变量声明res变量,接受read的第一个返回参数。但是,此举会改变err的作用范围:err成为了一个局部变量。什么意思呢?即此时的err被短变量声明所作用,成为了新声明对象,它只能作用于内部区域了。对于外部log.Printf而言,其引用到的err还是write方法生成的err对象。因此,即使read方法返回的err不为空,log.Printf打印的还是write方法的err结果,导致read的err内容被吞。

因此,为了避免此类错误发生,相应代码调整如下。

var res []byte  res, err = read()  if err == nil{   data = string(res)   return data, err  }

此时,当read返回err非nil时,日志打印如下。

2020/07/05 09:46:16 change data failed, err: this is a error, retry times : 1 2020/07/05 09:46:17 change data failed, err: this is a error, retry times : 2 2020/07/05 09:46:18 change data failed, err: this is a error, retry times : 3 2020/07/05 09:46:19 change data failed, err: this is a error, retry times : 4 2020/07/05 09:46:20 change data failed, err: this is a error, retry times : 5 2020/07/05 09:46:21 retry failed

感谢各位的阅读,以上就是“怎么解决Go语言的read读取错误”的内容了,经过本文的学习后,相信大家对怎么解决Go语言的read读取错误这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 怎么解决Go语言的read读取错误

本文链接: https://lsjlt.com/news/283137.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么解决Go语言的read读取错误
    这篇文章主要讲解了“怎么解决Go语言的read读取错误”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么解决Go语言的read读取错误”吧!情景描述代码中需要实现一个客户端与服务器的数据重传...
    99+
    2023-06-16
  • R语言读取文件报错怎么解决
    当R语言读取文件报错时,可以尝试以下几种解决方法: 检查文件路径:确保文件路径是正确的,并且文件存在于指定的路径中。 检查文...
    99+
    2023-10-23
    R语言
  • 基于bufferedreader的read()与readline()读取出错怎么解决
    本篇内容主要讲解“基于bufferedreader的read()与readline()读取出错怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于bufferedreader的read()...
    99+
    2023-06-22
  • c语言compilation错误怎么解决
    当遇到C语言编译错误时,可以采取以下步骤来解决问题:1. 仔细阅读错误信息:编译器通常会给出详细的错误信息,包括错误的行数和具体的错...
    99+
    2023-09-27
    c语言
  • c语言lnk1168错误怎么解决
    LNK1168错误是由于链接器无法完成链接操作而导致的错误。解决这个错误的方法可能有以下几种: 关闭进程:在编译或调试过程中,可...
    99+
    2023-10-23
    c语言
  • c语言error c2059错误怎么解决
    C2059错误是由于在语法中出现了错误的标点符号或者缺失了标点符号导致的。为了解决此错误,您可以尝试以下几种方法:1. 检查语法错误...
    99+
    2023-09-26
    c语言
  • Go语言怎么使用buffer读取文件
    这篇文章主要讲解了“Go语言怎么使用buffer读取文件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言怎么使用buffer读取文件”吧!buffer 是缓冲器的意思,Go语言要实现缓...
    99+
    2023-07-05
  • Go 语言 EOF 错误:破解错误代码的艺术
    go 语言中处理 eof 错误的最佳实践包括:使用 errors.is 检查错误是否是 io.eof;检查文件描述符以排除其他错误;使用 sentinel 错误或 eof 接口简化错误处...
    99+
    2024-04-08
    go语言 错误处理
  • R语言读取csv文件出错的解决方案
    今天在用R语言读取.csv文件的时候报错 Error in make.names(col.names, unique = TRUE) : invalid multibyte str...
    99+
    2024-04-02
  • Go语言函数的常见错误及解决方法
    标题:Go语言函数的常见错误及解决方法 Go语言作为一种简洁高效的编程语言,函数是其重要的组成部分。在编写函数时,不可避免地会遇到一些常见的错误,本文将介绍一些常见的函数错误以及它们的...
    99+
    2024-03-10
    返回值错误 参数错误 空指针异常 go语言 string类
  • 基于bufferedreader的read()与readline()读取出错原因及解决
    目录bufferedreader的read()与readline()读取出错bufferedReader中的readLine()源码解析bufferedreader的read()与r...
    99+
    2024-04-02
  • Go语言Websocket开发指南:解决常见错误
    Go语言Websocket开发指南:解决常见错误,需要具体代码示例在当今互联网应用中,实时通信已成为一项关键的技术需求。Websocket作为一种双向通信协议,被广泛应用于实时通信场景。而在Go语言中,使用Websocket进行开发同样是一...
    99+
    2023-12-14
    Go语言 websocket 常见错误解决
  • go语言eof错误是什么
    在go语言中,eof是指文件结尾错误,是Go语言中最重要的错误变量,存在于io包中,用于表示输入流的结尾。因为每个文件都有一个结尾,所以“io.EOF”很多时候并不能算是一个错误,它更重要的是表示一个输入流结束了。本教程操作环境:windo...
    99+
    2023-05-14
    eof错误 go语言
  • pycharm读取文件错误如何解决
    解决 pycharm 读取文件错误的方法包括:检查文件路径、是否存在、权限,以及编码问题。关闭已锁定文件的应用程序。检查文件权限和内存限制。排除损坏的文件。检查安全设置。更新 pycha...
    99+
    2024-04-19
    python pycharm
  • go语言eof错误指的是什么
    这篇文章主要介绍了go语言eof错误指的是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇go语言eof错误指的是什么文章都会有所收获,下面我们一起来看看吧。在go语言中,eof是指文件结尾错误,是Go语言中...
    99+
    2023-07-05
  • c语言代码错误提示怎么解决
    解决 c 语言代码错误的最佳方法包括:1. 阅读错误提示;2. 检查语法和拼写;3. 理解编译器消息;4. 利用调试工具;5. 寻找其他资源;6. 修复错误并重新编译;7. 持续测试。 ...
    99+
    2024-04-13
    c语言
  • Go语言中怎么有效处理错误
    今天就跟大家聊聊有关Go语言中怎么有效处理错误,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、简介Go语言受到诟病最多的一项就是其错误处理机制。如...
    99+
    2024-04-02
  • python编码格式导致csv读取错误怎么解决
    这篇文章主要讲解了“python编码格式导致csv读取错误怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python编码格式导致csv读取错误怎么解决”吧!python编码格式导致c...
    99+
    2023-06-30
  • Go语言的错误处理方式
    这篇文章主要介绍“Go语言的错误处理方式”,在日常操作中,相信很多人在Go语言的错误处理方式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言的错误处理方式”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-15
  • springboot读取application.yml报错怎么解决
    今天小编给大家分享一下springboot读取application.yml报错怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作