这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
实现方法: 基于课程中给出的样例代码 simpledict/v4,加入并发控制,即可简单实现。
翻译接口: 彩云小译、火山翻译;
其中,彩云翻译接口已经在课程视频中有介绍和获取方法,并且 simpledict/v4 中也是请求彩云这个接口的代码。
火山接口获取方法
在浏览器打开 火山翻译 网页,右键检查;
然后在翻译中查询任一单词即可;
在 network 中找到下图所示的这个包,再按照课程视频中介绍的方法,获取请求代码和响应结构代码。
代码结构
在程序中,给火山翻译的响应结构重命名(和彩云翻译的要不一样),并按照类似的方法构造一个请求结构,如下:
type VolcDictRequest struct {
Text string `json:"text"`
Language string `json:"language"`
}
对于向火山翻译请求的代码,和彩云翻译一样,放在一个函数中,结构如下所示:
并发控制
在另一个函数中进行并发调用,如下:
func query(word string) {
var wg sync.WaitGroup
wg.Add(2)
fmt.Println("query word is:", word)
go queryFromCaiyun(word, &wg)
go queryFromVol(word, &wg)
wg.Wait()
}
其中,使用 sync.WaitGroup 是为了让主进程等待两个查询子进程查询结束后再返回;不然,go routine 语句执行很快的,主进程一结束,子进程就会被迫结束,这样就没有查询结果的输出。
在两个函数中的最后添加一行代码:
wg.Done()
表示此进程结束。
总结
难点:
- 在 network 中找到正确的请求包没有熟练的方法和技巧,可能做的比较少,没有经验;
- 对于 go 的并发进程还只是在初步认知阶段,在没有使用 sync.WaitGroup 时,一直对两个子进程没有任何输出困惑了好久。