Go 实战案例| 青训营笔记
这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天,主要记录在实战案例中注意的一些点。
本堂课重点内容
- 猜谜游戏
- 在线词典
- SOCKS5
实践案例
猜谜游戏
在 中,可以使用 库生成随机数,初始时可以给定一个 ,称为随机化种子,相同的种子会生成相同的数字序列,因此可以使用当前的时间作为随机化种子,以保证多次运行时生成不同的数字序列。
使用 的方式控制输入流,并去除输入时的换行符,然后使用 库的 方法将字符串转化为数字,与生成的随机数比较,根据大小返回结果。
完整实现可参考 go-by-example
注意:与视频教程不同的是,在去除回车的时候可能需要使用 $"\r\n"$ 。否则可能会导致字符串转数字时出现错误。
在线词典
教程采用的是 fanyi.caiyunapp.com 网站,我们可以在该网页下打开开发者工具,找到如下请求:
然后点击 旁边的 和 内容如下:
其中, 的 表示查询的单词, 表示从什么语言翻译为什么语言。 包含了实际返回的内容。
要直接实现这样的请求十分复杂,但是我们可以使用简单的工具来辅助我们实现。
首先,右键我们的 请求。在 一栏中找到 ,将内容复制出来,贴到 curlconverter.com/go/ 中,就可以帮助生成代码。
为了帮助实现一个请求,我们可以自建一个结构体,注意在 中不要有多余空格
然后对结构体序列化即可。
为了防止请求内容过大导致占用大量内存,采取流式创建请求。
最后我们需要对收到的字节数组来反序列化获得结果,在 中通常是通过结构体来接收反序列化的结果的,但是这里的结构体过于复杂,因此我们可以使用一些工具来辅助我们建立这个结构体。
打开 oktools.net/json2go ,将在 中的内容复制进去,点击 即可自动生成一个符合要求的结构体,接下来我们只需要将这个结构体粘贴进我们的代码即可。
最后,我们只需要找到我们需要的字段(音标、内容等),对结构体获取内容即可。
完整实现可参考 go-by-example
SOCKS5
是一个代理协议,采取明文传输。
协议的工作原理如下:
下面要模拟这几个阶段实现 。
整个过程可以抽象为三个函数 , 和 。
处理每一个连接, 处理协商的过程, 处理发送请求、发送数据和 的过程。
对于获取报文段内的数据等过程,这里不再详述,只记录一些值得注意的细节。
在实现双向数据转发的时候,我们需要使用多个协程来实现并发,但是启动协程是几乎不耗时的,如果我们只是简单的启动协程并调用函数,那么可能我们就直接结束函数并返回了。 因此,我们需要使用 ,这是一个由 提供的强大的内容。一旦 执行,马上 就会跟着执行,这样就结束了这个函数。
个人总结
本次课程主要学习了:
- 在小项目中的使用
- 通过不同的 方式来合理的使用数据,提高复用
- 使用工具来帮助简化开发实现
- 使用