GO语言 上手-基础语言(遇到的问题和解决办法) | 青训营笔记

220 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记。

前言:

记录自己学习过程中的问题和反思,同时附上一些学习资料,方便自己也方便他人复习。

项目一:《猜谜游戏》

问题:输入数字不合法

err1.png

关键代码

reader := bufio.NewReader(os.Stdin)
for {
   input, err := reader.ReadString('\n')
   if err != nil { // (1)
      fmt.Println("An error occurred while reading input. Please try again", err)
      continue
   }
   input = strings.TrimSuffix(input, "\n")
   guess, err := strconv.Atoi(input)
   if err != nil { // (2)
      fmt.Println("Invalid input. Please enter an integer value")
      continue
   }
   ......
 }

解决办法

由提示知错误在(2),把ReaderSrting('\n')和TrimSuffix("\n")都转成byte数组输出看一眼:

image.png

首先查询ASCALL码知,13是'\r'回车符,10是'\n'换行符,原来windows系统每行结尾是'\r\n',Unix每行结尾是'\n',Mac Os每行是'\r',(原谅我今天才知道),然后查看官方文档知,ReaderSrting(delim byte)会读取以delim为分隔符前面的数据包括delim并以字符串的形式返回,TrimeSuffix(s string,suffix string)会将字符串s去掉后缀字符串suffix后的剩余字符串返回,因此前面strconv.Atoi(input)传入的字符串input每次都会带后缀'\r'导致出错,所以

法一

strings.TrimSuffix(input, "\n") 改为 strings.TrimSuffix(input, "\r\n")

法二

使用ReadLine(),ReadLine()会读取'\r\n'或'\n'之前的数据并以byte数组的形式返回,所以要在后面加个字符串的类型转换,即strconv.Atoi(string(input))

reader := bufio.NewReader(os.Stdin)
for {
   input, _ ,err := reader.ReadLine()
   ...... // (1)
   guess, err := strconv.Atoi(string(input)) 
   ...... // (2)
   ......
 }

PS:

课后作业也要记得加'\r\n'嗷

var guess int
_, err := fmt.Scanf("%d\r\n", &guess)

项目二:《简易词典》

问题

复制dict请求的cURL(cmd)的内容在Convert curl commands to code无法转换,原因还不知道

解决办法

改为复制dict请求的cURL(bash)

image.png

项目三

问题

windows系统默认不支持nc指令

解决方法

windows使用nc命令 - 林宇风 - 博客园

PS:

  1. 下载和解压的时候注意关闭杀毒软件防止系统删除
  2. 可以把nc.exe配置到任意路径但是得配置PATH环境变量

学习资料

课程项目代码

wangkechun/go-by-example

课件

Go 语言上手 - 基础语言.pptx - 飞书文档

课后

Go by Example 中文版