猜谜游戏
在猜谜游戏中,程序需要从命令行接收用户输入的数字,然后与随机数比较判断是否相等,如果不相等则让用户根据提示信息重新猜测生成的随机数的大小。可以看到,源代码中使用reader.ReadString从命令行读取一行的数据到input中,然后需要使用strings.TrimSuffix对input进行处理,最后再调用strconv.Atoi将string类型的input转成int类型。可以看到,源代码对输入的处理比较繁琐,下面我们将利用Scan函数对其进行改进。
// 原代码
fmt.Println("Please input your guess")
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("Invaild input.Please enter an integer value", err)
return
}
input = strings.TrimSuffix(input, "\n")
input = strings.TrimSuffix(input, "\r")
guess, err := strconv.Atoi(input)
以下为改进后的代码,直接调用fmt.Scan即可将输入的数字赋给guess。
var guess int
_, err := fmt.Scan(&guess)
单词翻译
原代码中调用彩云翻译API实现,这里增加百度翻译引擎。
- 创建请求
获取请求body中所包含的字段,然后设计一个结构体,其字段与获取到的字段一一对应
设置请求头
利用curlconverter.com/go/ 将复制得到的数据转换成对应的代码,完成请求头的设置。
- 接收返回的响应
定义一个结构体,字段和返回的reponse一一对应,然后再把返回的json字符串反序列化到结构体
利用oktools.net/json2go 将复制得到的json数据转成对应的结构体定义。
- 运行结果
提高翻译速度
比较简单的方式是利用现有的两个翻译引擎,分别开启对应的协程,这样可以通过并行执行进一步提高翻译速度。
go query(word)
go query2(word)
总结
在这几个作业中,印象比较深的是第二个作业。其难点主要在于不同翻译引擎的请求和响应的结构不一样,需要根据特定的数据结构特征做相应的处理。通过完成第二个作业,可以对网络的运行机制有了更进一步的认识。而对于第一个作业,虽然Scan函数的使用可以简化对输入的处理,但是原代码中的解决方案却可以增进对io相关知识的理解。对于第三个作业来说,如果对go语言的协程具有一定的了解,可以很快的想出相应的解决方案,通过利用协程可以并发的执行多个任务从而提升处理速度。