这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
本次青训营笔记将对Go语言原理与实践课后作业2、3进行分析
课后作业内容
- 简化go输入:修改第一个例子猜谜游戏里面的最终代码,使用fmt. Scanf来简化代码实现。
- 添加搜索引擎:修改第二个例子命令行词典里面的最终代码,增加另一种翻译引擎的支持。
- 并行翻译:在上一步骤的基础上,修改代码实现并行请求两个翻译引擎来提高响应速度。
添加搜索引擎
原代码中使用的搜索引擎为彩云小译(https://api.interpreter.caiyunai.com),该搜索引擎的payload非常简单,只需要发送TransType(翻译语言)和Source(需要翻译的单词)即可获得单词的音标和对应的中文词义。
然而彩云小译只是个特例,市面上能找到的大部分搜索引擎都需要发送更加复杂的请求才能返回想要的结果。比如百度翻译,不仅要发送TransType和query(需要翻译的单词),还需要发送sign,sign在前端生成,每个单词的sign都不相同,要想获得百度翻译的结果就必须获得每个单词对应的sign,然后再一起发送给服务器,然而sign的生成算法是未知的,因此我们便无法将百度翻译作为第二个翻译引擎了。
其他的翻译引擎也是类似的情况(bing翻译,谷歌翻译等),最后经过不断的尝试,我找到了有道翻译(dict.youdao.com) 。有道翻译和彩云小译类似,只需要在请求体中附带“q=word”即可获得该单词的音标和中文词义。代码如下所示:
var data = strings.NewReader(`q=` + word)
req, err := http.NewRequest("POST", "https://dict.youdao.com/jsonapi_s?doctype=json&jsonversion=4", data)
if err != nil {
log.Fatal(err)
}
我们通过strings.NewReader构建请求体,然后使用http.NewRequest包装成http请求,并且保存在了req内。后续我们还需要设置请求头,然后在发送请求后处理返回的结果,并且对代码进行进一步完善。