Go语言的实战案例

339 阅读4分钟

1、猜谜游戏

首先,我们定义一个随机数,作为要猜的数

通过调用rand库中的函数来实现

image.png

需要注意的是,教程中Go版本为1.14,在生成随机数时多次生成会产生一样的结果,因而需要设定时间戳种子。而在高版本,例如1.20版本,则不需要设定,直接就是随机的


接下来,读取用户输入

image.png

通过标准输入流读取用户输入的字符串,然后去掉换行符,并将其转为数字

这里需要注意,不同操作系统的换行符是不同的,mac是\r,windows是\r\n,linux是\n,需要根据自己的操作系统更改换行符后缀

当然这里可以通过更简洁的fmt.Scanln来获取输入,不过据说后面还要用到输入流,就采用这种比较曲折的方式了


然后我们就可以对结果进行判断,同时为了能让游戏一直进行,从输入开始置为循环,直到输入正确结果,此外还应将出现错误时的return终止语句改位continue

image.png

在线词典

首先,我们需要先进入到一个翻译网址

fanyi.caiyunapp.com/

右键点击检查或者直接按键盘F12,打开开发者工具

image.png

点击network,并找到以Post方式请求的url

image.png

右键拷贝其url路径

image.png

接下来打开另一个代码生成网址

curlconverter.com/

将刚才复制的url路径拷贝过来

image.png

然后将下方生成的代码直接copy到编辑器中

但此时我们发送的数据是写死的,我们需要自己创建并发送Json数据

因而我们接下来要像之前一样创建一个结构体

image.png

因为json.Marshal返回的不是一个真正的字符串而是一个byte数组,因而在转为data时选用bytes.NewReader而不是strings.NewReader


接下来我们需要解析Response

首先打开一个网站

oktools.net/json2go

将之前返回的Response结果拷贝进去,点击转换-嵌套便可生成对应结构体

image.png

下面我们便可将原来获取的bodyText发序列化成结构体

image.png

然而此时里面许多字段,我们是不需要的,因此我们只用提取并输出我们需要的部分

image.png

随后,我们将前面的输入进行改造,将发送http请求抽取作为一个函数,传入word

image.png

测试结果

image.png

成功

Socket5代理

下图代理的原理

image.png

在实现代理之前,我们先尝试一个请求的连接

image.png

这里应用到Go语言的并发特性,通过go关键字可以很方便地开启一个子线程

在线程里使用defer关键字进行延迟断开连接操作,可以使得在该子线程执行的最后成功断开当前连接,避免线程资源的消耗

其中有一点,我们可以看到字节流的读取是ReadByte,看起来是一个字节一个字节的读,非常低效,但实际上底层会将字节进行一个合并,当读第一个字节,会提前将接下来一个kb的字节都读取,再读后续时会瞬间返回


接下来通过nc命令测试是否连通

nc (netcat)下载地址

eternallybored.org/misc/netcat…

首先启动程序,然后在终端输入 nc 127.0.0.1 1080 (1080是程序中配置的端口,可以换成任意为占用端口)

image.png

可以返回我们输入的字符串,代表连通成功

下一步我们就要实现协议的认证阶段,首先定义一个auth函数用于键传

其中ver为协议版本,methodSize为支持认证的方法数量

image.png

此外将原来process函数中的死循环改为调用auth函数

image.png

课后作业

1、修改第一个例子,使用fmt.scanf来简化代码

image.png

2、修改第二个例子,增加另一种翻译引擎的支持

这里选用百度翻译

同样是获取请求的url去解析,并定义结构体

image.png

image.png

测试,成功

image.png

3、在上一步的基础上,修改代码实现并行请求两个翻译引擎

将两个函数根据访问的引擎定义名称,然后在调用函数前加上go关键字,即可并发访问,同时还要在main函数加上time.sleep,否则调用的函数还未执行完返回结果,main函数已经结束了

image.png