《Go 语言上手-基础语言》课后作业小结 | 青训营笔记

128 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记

今天听字节的老师讲课的第一天,虽然讲的是GO语言的基础部分,但也获益匪浅。 这篇文章的主题是课后作业的小结,因此先来看看课后作业的要求:

  • 对课上的猜数字游戏的输入做简化,使用fmt.Scanf来接收用户的输入

  • 对在线词典的程序增加支持另一个翻译引擎

  • 对前面的在线词典程序作并发改进,获得更快的词典查询速度

    第一个课后作业,虽然要求挺简单,但是当我直接使用fmt.Scanf来处理用户输入,程序其他部分不变时,会有如下错误:

    image.png

    可以看到我只输入了一个数字55,但程序在接收了我的输入55后,还继续读取了数据(我猜实际就是回车\r\n,不清楚这是不是Window下才有的问题),因此为了避免这个错误,需要进行一些处理。

    我的处理方法是:fmt.Scanf("%d\r\n",&input)这样读取到的输入就只会把回车前的数据读取到了

    第二个课后作业,要求增加支持另一个翻译引擎。我选择了百度翻译。这个课后作业首先需要通过抓包来获得翻译引擎的接口,再通过自己构建请求去获得翻译引擎的Response。

    要实现增加多一个翻译引擎,需要对程序接收的参数多加一个选择引擎参数,这里为了简单,就用1表示第一个翻译引擎,2表示第二个翻译引擎。

    在实现时,两个翻译引擎写在两个函数里,通过switch 选择引擎参数,来确定用户选择哪个引擎来查询。

    image.png

    这里把原本代码里的DictRequest和DictResponse也写到了引擎各自的函数里,这样可以使得不同引擎的数据分离,不至于混杂在一起 image.png

最后一个课后作业,是使用并发请求来提高在线词典的查询速度,这个作业让我第一次体会到GO的精髓。原生支持并发的操作,用起来还挺爽的哈哈。

一开始我是直接使用GO 来启动Go程而不作其他修改,结果运行时没有任何结果处理。

在一番查询后,我才得知,main函数并不会等待GO程结束才终止,这样一来,Go程还在请求的时候main函数就早早结束,当然就没有输出结果了。知道了原因后就很好办了,最简单的办法就是让main函数等待Go程完成后才结束。这里我使用的是sync.WaitGroup来实现,利用这个库,我们可以创建一个类似信号量的一个变量(我感觉很像信号量,不过因为不了解底层实现,所以姑且说是类似),利用这个变量,来实现PV操作,使main函数等待Go程结束。实现如下:

image.png

另外要在每个query函数中加上defer wg.done()

image.png

让进程结束时给出进程完成的信号

最后就能实现并发请求了:

image.png