青训营课程 Lesson1 作业记录 | 青训营笔记

169 阅读3分钟

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

1.1 用fmt.scanf来简化猜字游戏的代码
  • 具体代码略,做的时候发现一个小问题,Windows下用_, err := fmt.Scanf("%d", &guess)来获取用户输入,会报错unexpected newline
  • 发现是将换行符/回车当做字符来处理了,改成_, err := fmt.Scanf("%d\n", &guess)就没问题了
1.2增加另一种翻译引擎的命令行字典
  • 用的火山翻译,先去找到curl请求,复制到curlconverter.com/#go ,生成代码,注意Windows是用copy as URLs(bash);这一步遇到一个小问题,发现有两个POST请求都有生成翻译的JSON串,但只有选RequestULR是dict的那个才能成功,translate那个不行
  • 然后写一个Request的结构体,字段跟读取到的对应起来,这里发现写上UserID字段的话会报错:invalid character 'B' looking for beginning of value(不知道这是为什么,明明老师的范例里加了不报错,不知道这个结构体的字段是怎么确定的),总之这个结构体里有两个字段Language和Text
  • 接着是复制preview里的json串到oktools.net/json2go 来生成Response的结构体,然后把bodyText反序列化到这里面(应该就是把读取到的内容跟每个字段对应起来)
  • 然后找到其中的Explanation,只把这个,即单词的翻译打印出来,需要注意的是,这里的Words结构体和PosList结构体都是个数组,要用遍历,不能像彩云翻译那样直接dictResponse.Dictionary.Prons.En,打印音标也是如此
  • 最后把主函数改成一个query函数,使我们可以输入单词,而不是写死的一个单词,这样就完成了
  • 这题感觉主要巩固了结构体,序列化和反序列化,这里的序列化和反序列化感觉主要就是结构体和JSON串的相互转换
1.3并行请求两个翻译引擎来提高响应速度
  • 这里用到了第二次课的并行知识,在函数前面加上go就代表并行(虽然是第二次课的知识,但我第二次课的笔记。。写在随手记里的。。没了。。。真的无语。。。。不过感觉也是流水账,作业相关的就记在这里。)
  • 用到了go的sync包,这个包提供了常见的并发编程同步原语,这边是使用的waitGroup,主要是三个方法,Add(delta int),计数器+delta,Done(),每有一个协程执行结束,计数器-1,Wait(),阻塞直到计数器为0
  • 这边我是把彩云翻译的v4/main.go里面代码直接复制到火山这边来了,不知道能不能直接import进来。。
1.4其他的一些知识点
  • 边听课边记的笔记感觉很流水账,回看的时候发现一些个人感觉比较陌生的知识点,记在这里
  • defer是go中一种延迟调用机制,defer后面的函数只有在当前函数执行完毕后才能执行,通常用于释放资源。proxy/v1/main.go里的例子:defer conn.Close()
  • 可以用net.Dial来建立TCP连接
  • socks5实践那块,前面都看懂了,最后v4有一段话很绕,在这留存一下:::现在有一个问题,connect函数会立刻返回,返回的时候连接就被关闭了。需要等待任意一个方向copy出错的时候,再返回connect函数。这里可以使用到标准库里面的一个context机制,用context连with cancel来创建一个context。在最后等待ctx.Done(),只要cancel被调用,ctx.Done就会立刻返回。然后在上面的两个goroutinue里面调用一次cancel即可