这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
第一节课的课后作业有三个:
1、将示例代码一中的输入改为Scanf实现
2、在示例代码二的基础上增加对以一个翻译引擎的支持
3、在第二个作业的基础上实现并发请求
第一部分
由于是第一次使用Go语言,便去了解了一下Scanf函数的使用方式。
func Scanf(format string, a ...interface{}) (n int, err error)
Go语言中的Scanf函数和C语言的Scanf函数类似,都是用于从控制台得到格式化输入。其中,第一个参数是输入的格式字符串,后面几个参数是需要赋值的变量地址。函数有两个返回值,第一个返回值是成功读取的变量个数,第二个参数表示读取过程是否发生错误。
其中,在第一个作业的代码实现过程中,格式字符串最后要加上"\n"符号,否则我们输入的换行符会被下一次循环读取,造成报错。
第二部分
增加另一个翻译引擎的支持,大致分为以下几个步骤:
- 打开一个翻译网页,进入“检查”页面,找到“网络”
- 在翻译页面输入需要翻译的内容,检查“网络”中自下而上的请求,找到包含翻译文本的请求
- 右键获取请求的curl命令,到 curlconverter.com/#go 网站将其转化为Go语言中的发起请求代码,并且编写请求头的结构体。在发起请求时需要使用查询文本初始化该结构体并且序列化,将其加入到请求中。
- 通过 oktools.net/json2go 得到返回的json内容的结构体,将翻译引擎的返回内容反序列化到该结构体中,并且打印该结构体中的翻译内容。
我新增了火山翻译的引擎,其中请求头的结构体如下:
type VolRequest struct {
Text string `json:"text"`
Language string `json:"language"`
}
运行结果如下如:
第三题的完成主要使用了sync.WaitGroup对象,该对象主要用于协程间的同步,主要有三个方法:Add(), Done(), Wait()。其中Add()用于设置计数器的值,Done()方法会将计数器的值-1,而调用Wait()的协程会阻塞,直到计数器的值被置为0。
主函数的同步代码部分如下:
word := os.Args[1]
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
query(word)
}()
go func() {
defer wg.Done()
queryVol(word)
}()
wg.Wait()
实现的效果如下图所示: