后端入门 - Go 语言原理与实践课后作业1分析 | 青训营笔记

114 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

本次青训营笔记将对Go语言原理与实践课后作业1进行分析

课后作业内容

  1. 简化go输入:修改第一个例子猜谜游戏里面的最终代码,使用fmt. Scanf来简化代码实现。
  2. 添加搜索引擎:修改第二个例子命令行词典里面的最终代码,增加另一种翻译引擎的支持。
  3. 并行翻译:在上一步骤的基础上,修改代码实现并行请求两个翻译引擎来提高响应速度。

简化go的输入

首先我们需要对原代码进行分析,原代码首先使用bufio.NewReader将输入转化为流的形式,随后通过reader.ReadString读取流中一整行的数据(读取到换行符停止),需要注意的是该操作也会把最后的换行符一起读取到input里,因此最后还需要调用strings.Trim把末尾的换行符删去。但是此时的input变量类型为字符串,为了后续能够进行数字的比较,这里还需要使用strconv.Atoi把字符串转换为整数。
从以上的分析中可以我们可以发现,原代码对输入的处理非常繁琐,在不包括错误处理的情况下,总共用到了4个函数。我们将使用fmt. Scanf对代码进行简化。

// 原代码
fmt.Println("Please input your guess")
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')
if err != nil {
   fmt.Println("An error occured while reading input. Please try again", err)
   return
}
input = strings.Trim(input, "\r\n")
guess, err := strconv.Atoi(input)

以下为简化后的代码,直接调用fmt. Scan即可将输入的数字赋值给guess,仅仅需要一个函数即可完成输入。

// 简化后的代码
var guess int
_, err := fmt.Scan(&guess)

go的输入方法

通过查阅go语言文档(studygolang.com/pkgdoc) 可以发现Go可以通过Scan、Scanf和Scanln从标准输入os.Stdin读取文本,而Scanf、Fscanf、Sscanf会根据格式字符串解析参数,类似Printf。