前言
这次课后作业大概的内容是:
1.修改第一个例子猜谜游戏中的最终代码,使用fmt.Scanf来简化代码实现
2.修改第二个例子命令行词典中的最终代码,增加另一种翻译引擎的支持
3.在上一步骤的基础上,修改代码实现并行请求两个翻译引擎来提高响应速度
猜谜游戏
1.实现思路
课程中的思路是:通过rand生成随机数;再用生成随机数种子的方式使得每次生成的数都不一样(这一步我也不是很懂);后读取用户输入的数(可以有多种方式);再实现逻辑判断,提示用户猜的数是太大还是太小;最后是实现循环,使得猜数猜错时不断进行到猜对为止
2.修改后的代码
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
maxNum := 100
var num int
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
// fmt.Println("The secret number is ", secretNumber)
for {
fmt.Println("Please input your guess")
_, err := fmt.Scanf("%v\n", &num)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
fmt.Scanf("%v\n", &num)
continue
}
fmt.Println("You guess is", num)
if num > secretNumber {
fmt.Println("Your guess is bigger than the secret number. Please try again")
continue
} else if num < secretNumber {
fmt.Println("Your guess is smaller than the secret number. Please try again")
continue
} else {
fmt.Println("Correct, you Legend!")
break
}
}
}
3.实现截图
4.注意点
这里有段代码起着重要的作用:
_, err := fmt.Scanf("%v\n", &num)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
fmt.Scanf("%v\n", &num)
continue
}
它的作用是将用户每次输入的数解析为整数,如果错误,就提示;而这里fmt.Scanf("%v\n",&num)的作用是清空输入缓存区,避免继续提示解析错误。
词典
思路
1.抓包:到翻译网站后按F12进入开发者模式;点击翻译,network找到dict检查respondse
2.代码生成:右键dict-Copy URL到网站 curlconverter.com/go#生成代码,复制到文件中
3.解析response:oktools.net/json2go/复制到这个网站生成结构体复制到文件中
4.通过cmd命令窗口运行go文件
修改后的代码:
由于没有找到百度翻译中相应的dict,直接找了个类似有内容的进行操作,后面验证是正确的,就是在结构体找不到英标等几个要求输出的。
这里的运行结果只能运行出来彩云翻译,百度翻译的因为结构体内容实在找不出来,就随便替换了一个上去(这里也没显示),代码编译器复制过来太长了,就直接给结果吧。
并行翻译
在 Go 语言中,可以使用 goroutines 来实现并行请求两个函数。使用go标准库sync里的var wg sync.WaitGroup并行执行两个翻译函数。
结语
总的来说,猜谜游戏并不是很难理解,主要还是看在命令翻译这一块,可能是我的知识面太窄,还接触不到这些知识,对于我来说难度飙升,在线上问别人也不能找出问题,卡了一整天,一直在翻别人的案例(找不到代码,找到了也是不全面或是生成的代码不一样),只能自己体悟,还有就是并行翻译这一块完全不懂,争取后面把它搞懂。