这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
本次青训营笔记将对Go语言原理与实践课后作业1进行分析
课后作业内容
- 简化go输入:修改第一个例子猜谜游戏里面的最终代码,使用fmt. Scanf来简化代码实现。
- 添加搜索引擎:修改第二个例子命令行词典里面的最终代码,增加另一种翻译引擎的支持。
- 并行翻译:在上一步骤的基础上,修改代码实现并行请求两个翻译引擎来提高响应速度。
简化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。