goLang实践,搭建并行翻译系统 | 青训营笔记

240 阅读4分钟

在掌握GoLang最基本的语法之后,让我们着手完成一个练手项目来进行实战,熟悉go的实际使用并练习基础语法。

获取彩云翻译的翻译引擎

因为这个小项目不是自己编写翻译引擎,所以第一步需要获取你想要使用的翻译软件的翻译引擎,而获取这个引擎的方法也比较简单,主要步骤就是进入彩云翻译,然后在翻译中输入你想查询的单词,然后F12进入开发者工具,进入network 找到翻译的接口,然后复制他的curl路径。

dict.png

注意在获取翻译引擎路径的时候,一定要找到正确的数据报,即要找到请求方法为POST的数据报。

rightpost.png

获取正确的curl后,进入go的curl代码在线生成网站进行代码生成,这里需要注明一下,此处其实使用代码生成器是比自己写这个请求代码更好的选择,因为对于这种复杂的curl一般需要编写很长的header数据,一般很难自己做到完善的编写,同时也很容易出错,与之类似的是,当我们获取数据报数据进而编写go对应的type 时,也建议用在线代码生成器完成。当然在学习的时候字节老师也使用了比较方便的代码生成网站:

cURL转go: curlconverter.com/#go

JSON转go: oktools.net/json2go

进入curl转go的在线生成器,获取对应的go代码,

curl2go.png

然后将代码复制到go的项目中即可进行下一步。

实现数据获取的type,正确接收翻译后的数据

回到彩云翻译的页面,然后进入开发者工具,找到刚才的dict数据报,进入preview页面,然后复制返回数据的对象

获取type.png

然后进入JSON转golang的在线转换网站,获取到对应的代码,在这里采用嵌套格式,方便type的使用,

json2go.png

然后把生成的代码复制到项目中即可。

注意代码的编写规范,即便是生成的代码,也不要排版太乱。

完善逻辑,实现对命令行输入的单词的翻译

当我们将代码移到我们的项目中时,所有的数据都是死数据,比如我们是复制的 'hello' 的curl然后转为go的代码,那么我们的代码得到的数据只能是对于hello的翻译,所以我们需要进一步修改代码,为了省去前台的开发时间,这里采用使用命令行进行翻译,然后将翻译的结果也输出到命令行。

以下为具体的翻译函数的逻辑。

1.png

2.png

获取另一个翻译引擎的翻译实现

因为要实现并行翻译,那么最少需要两个不同的翻译引擎,所以需要在彩云翻译之外另选择一个翻译引擎,并通过与上相同的步骤获取其翻译引擎。这里我采用的是百度翻译。

3.png

4.png

注意:

  • 定义的数据报的结构体一定要和数据报的结构对应,否则即便访问接口没问题,也拿不到想要的结果。
  • 百度翻译的数据报名称和彩云翻译略有不同,这一点其实自己观察拦截到的数据报,找到正确的翻译结果的数据并且请求方式为POST的数据报,然后复制其cURL即可。
  • windows系统在进行代码生成时,建议复制bash版本的cURL

实现函数并行处理

go语言对于处理并发具有先天优势,可以使用多个协程实现并发,但是在进行并发处理时,新激活的goroutine的结束过程是不可控的,我们不知道什么时候goroutine执行结束,也就是说单纯的为函数开启并行执行,最后可能什么结果也拿不到。

课堂上对于等待goroutine执行完成提供了两种方法:

  1. time.sleep() 让程序停一段时间,但是我们无法把控程序具体的执行时间,但一般程序休眠哪怕一点时间也足够了。
  2. sync.WaitGroup (建议使用),使用该方法可以等待其组中的所有goroutine全部执行完成。

这里我将两种方法都实现了一下,以下为实现代码:

WithGroup:

5.png

6.png

7.png

time.sleep():

8.png

执行结果:

9.png

对于GoLang的学习还在继续