Go语言的实战案例| 青训营

66 阅读3分钟

一、猜谜游戏

1.1 生成随机数

首先,我们定义一个随机数,作为要猜的数通过调用rand库中的函数来实现

image-20230829184555741.png

  • 使用时间戳来初始化随机数种子

image-20230829184622503.png

  • 运行结果

image-20230828205329695.png

image-20230828205345408.png

1.2 读取用户输入

image-20230829184654197.png

1.3实现游戏逻辑

通过标准输入流读取用户输入的字符串,然后去掉换行符,并将其转为数字,然后我们就可以对结果进行判断,同时为了能让游戏一直进行,从输入开始置为循环,直到输入正确结果,此外还应将出现错误时的return终止语句改位continue

image-20230829184858651.png

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

  • 运行结果

image-20230828221126885.png

二、在线词典介绍

用户在命令行里面查询一个单词,通过调用第三方的API查询到单词翻译并打印出来,下面实例中,我们会使用GO语言来发送HTTP请求、解析json过来,以及如何使用代码提高开发效率

2.1抓包

2.1.1 浏览器登入网站

浏览器登入网站-->彩云小译 - 在线翻译 (caiyunapp.com)

2.1.2 捕捉用来查询单词的请求

右键查询->使用翻译->在网络中找到dict请求(其中请求方法为post)

image-20230829130048591.png

  • 请求信息

image-20230829130329976.png

image-20230829130356116.png

2.2代码生成

2.2.1 在goLang中发送请求

正常来说,请求命令的发送代码比较复杂,下面会使用别人的代码进行实验。

  • 代码生成

image-20230829130647558.png

进入Convert curl to Go (curlconverter.com)生成GO语言代码

image-20230829131719297.png

  • 生成一大串JSON

image-20230829132247223.png

此时我们返的数据是JSON格式的,而现在那个输入是固定的,我们是要从一个变量来输入,我们需要用到JSON序列化

2.3生成、解析request body

在GoLang里面,我们需要生成一段JSON,常用方法是构造一个结构体,这个结构体要和我们需要生成的JSON的结构是一一对应的

  • 请求序列化

image-20230829192834834.png

  • 解析Response
  1. 首先打开一个网站 oktools.net/json2go
  1. 将之前返回的Response结果拷贝进去,点击转换-嵌套便可生成对应结构体

image-20230829194100199.png

  1. 下面我们便得到了一个response 结构体,下面再改进代码,先定义一个response结构体的对象,然后再JSON.unmarshal把body反序列化到结构体里,并打印。

image-20230829195036746.png

  • 打印结果

image-20230829194334414.png

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

image-20230829195458196.png

  1. 完善代码

image-20230829195745705.png

image-20230829195759242.png

2.4运行结果

image-20230829200743897.png

三、Socket5代理

  • 原理

9bf4f8a2ca934bb5bf9f8035910b9d5ctplv-k3u1fbpfcp-zoom-in-crop-mark1512000.webp

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

14bcca0061cf42a2b9e97bacc4bc6f3atplv-k3u1fbpfcp-zoom-in-crop-mark1512000.webp

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


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

netcat下载地址eternallybored.org/misc/netcat…

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

ef820982453e4a958c15b06c75605b8ctplv-k3u1fbpfcp-zoom-in-crop-mark1512000.webp

返回输入的字符串,代表连通成功

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

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

72eb1ac43d904519898e6b0205622d4btplv-k3u1fbpfcp-zoom-in-crop-mark1512000.webp

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

bb15dc9c5bfa44b79de66980eeba5966tplv-k3u1fbpfcp-zoom-in-crop-mark1512000.webp

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

image-20230829201554394.png