go语言基础:实现有两个并发查询请求的命令行字典 | 青训营笔记

168 阅读2分钟

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

实现方法: 基于课程中给出的样例代码 simpledict/v4,加入并发控制,即可简单实现。

翻译接口: 彩云小译、火山翻译;

其中,彩云翻译接口已经在课程视频中有介绍和获取方法,并且 simpledict/v4 中也是请求彩云这个接口的代码。

火山接口获取方法

在浏览器打开 火山翻译 网页,右键检查;

然后在翻译中查询任一单词即可;

在 network 中找到下图所示的这个包,再按照课程视频中介绍的方法,获取请求代码和响应结构代码。

image.png

代码结构

在程序中,给火山翻译的响应结构重命名(和彩云翻译的要不一样),并按照类似的方法构造一个请求结构,如下:

type VolcDictRequest struct {
	Text     string `json:"text"`
	Language string `json:"language"`
}

对于向火山翻译请求的代码,和彩云翻译一样,放在一个函数中,结构如下所示:

image.png

并发控制

在另一个函数中进行并发调用,如下:

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()

表示此进程结束。

总结

难点:

  1. 在 network 中找到正确的请求包没有熟练的方法和技巧,可能做的比较少,没有经验;
  2. 对于 go 的并发进程还只是在初步认知阶段,在没有使用 sync.WaitGroup 时,一直对两个子进程没有任何输出困惑了好久。