GO语言工程实践课后作业 | 青训营

66 阅读2分钟

猜谜游戏

生成随机数

在老师的演示中,我们会发现不设置时间戳程序每次生成的随机数是相同的。但在新版本Go中,go语言解决了需要设置时间戳的问题,意味着我们不再需要设置时间戳,依然可以生成随机数。

image.png

值得注意的是,rand.Intn生成的随机数范围是0~n,左闭右开,意味着并不会取到n这个值。

用户从终端输入

对此,我们使用fmt.Scanf来实现用户从终端输入所猜数字。

image.png

图中的第13行,“%d”表示的是一个十进制的整数。并且,里面的变量需要在变量名前加一个“&”符号,代表的取其的地址。最后,我们再将猜测的值和答案比较,使用IfSwitch语句就可以实现程序的要求。

命令行在线词典

抓包和代码生成

在老师的视频中展示的是彩云翻译,而在本文,我实现的是百度翻译。我使用的是搜狗浏览器。打开页面,按F12审查元素,可以找到“sug”为我们所想找的目标。我们右击它,选择Copy as cURL(bash),并进入这个网址:curlconverter.com/go/ ,将其转换成代码。

image.png

将转换后的代码复制到编辑器后并运行,得到的是一大段json则证明上面步骤没有出错。

代码修改

与课上的操作不同,我们观察可以发现,生成的代码内部仅有kw=hello,通过分析可知,kw=之后的单词,则是我们需要翻译的单词。因此,我们不用再构建一个结构体,可直接做以下修改:

image.png 这里面的word则是我们最后修改这部分代码为函数的形参

解析Response body

将审查元素界面内,将“sug”文件的Response内的json转为结构体。实现网址:oktools.net/json2go

image.png 将生成好的结构体复制进编译器,并将结构体名修改为DictResponse

完善代码

后面的操作,和老师的修改方式基本一致。将最初的func main(){}修改为func query(word string) {} 再在最后加入上主函数,既可以实现基于百度翻译的在线词典。

image.png

实现在线词典并发

将百度和彩云的结构体和函数复制到同一个文件下。(记得修改结构体和函数的名字,别重复了)

再引用sync这个包,使用sync.WaitGroup建立一个全局变量。用于等待一组线程的结束。再在两者的函数体内,加上wg.Done()

image.png

在主函数中,在调用两个函数之前运用wg.Add(2)。记得最后加上wg.Wait(),等待所有线程完成。至此,就完成了目的。

image.png