这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记
这次是实战项目中体现出的各种知识点笔记
第一个项目 擦猜数游戏用到的知识
输入输出
这个我们一般使用Golang标准库之fmt包 fmt包实现了类似C语言printf和scanf的格式化I/O。主要分为向外输出内容和获取输入内容两部分。
输出实例:
s := "hello"
n := 123
p := point{1, 2}
fmt.Println(s, n) // hello 123
fmt.Println(p) // {1 2}
fmt.Printf("s=%v\n", s) // s=hello
fmt.Printf("n=%v\n", n) // n=123
fmt.Printf("p=%v\n", p) // p={1 2}
fmt.Printf("p=%+v\n", p) // p={x:1 y:2}
fmt.Printf("p=%#v\n", p) // p=main.point{x:1, y:2}
通用占位符
其它的还有各种占位符以后用到就知道了。
| 宽度标识符占位符 | 说明 |
|---|---|
| %f | 默认宽度,默认精度 |
| %9f | 宽度9,默认精度 |
| %.2f | 默认宽度,精度2 |
| %9.2f | 宽度9,精度2 |
| %9.f | 宽度9,精度0 |
输入实例
Go语言fmt包下有fmt.Scan、fmt.Scanf、fmt.Scanln三个函数,可以在程序运行过程中从标准输
有时候我们想完整获取输入的内容,而输入的内容可能包含空格,这种情况下可以使用bufio包来实现。示例代码如下:
reader := bufio.NewReader(os.Stdin) // 从标准输入生成读对象
fmt.Print("请输入内容:")
input, _ := reader.ReadString('\n') //读到换行
input = strings.TrimSpace(input) //去除前后空格
input = strings.TrimSuffix(input, "\n") //去掉尾随后缀字符串"\n"
注意:windows下使用bufio读取string转化为int应该去除\r\n
即 : input = strings.TrimSuffix(input, "\r\n")
rand随机数
go中生成随机数的有两个包,分别是“math/rand”和“crypto/rand”
- 前者实现了伪随机数生成器,
- 后者实现了用于加解密的跟安全的随机数生成器,当然,性能也就降下来了,毕竟鱼与熊掌不可兼得
我们使用 math/rand 时要先要调用 func Seed(seed int64) 方法为我们的随机数设置种子不然全是一样的数。
啥?种子?我也是第一次听说。
种子我的理解就是随机数都是根据种子来计算出来的,而计算随机数的算法是固定的,如果种子不变,那么计算出来的随机数也就不再随机了,所以种子要设置一个时刻变化的数。
例如使用系统时间戳作为种子
maxNum := 100
rand.Seed(time.Now().UnixNano()) //设置随机数种子
secretNumber := rand.Intn(maxNum)
fmt.Println("The secret number is ", secretNumber)
获取系统时间戳
now := time.Now()
fmt.Println(now.Unix()) // 1648738080
第二个项目 字典程序
调用第三方api实现的翻译,涉及抓包和访问接口,json转换等知识 用到两个工具网站:
cURL转go代码:curlconverter.com/#go
json转go结构体:oktools.net/json2go
JSON与实例转化:
序列化为一个字符串:
a := userInfo{Name: "wang", Age: 18, Hobby: []string{"Golang", "TypeScript"}}
buf, err := json.Marshal(a)
if err != nil {
panic(err)
}
fmt.Println(buf) // [123 34 78 97...]
fmt.Println(string(buf)) // {"Name":"wang","age":18,"Hobby":["Golang","TypeScript"]
反序列化回结构体:
var b userInfo
err = json.Unmarshal(buf, &b)
if err != nil {
panic(err)
}
fmt.Printf("%#v\n", b) // main.userInfo{Name:"wang", Age:18, Hobby:[]string{"Golang", "TypeScript"
SOCKS5代理服务器
SOCKS5协议是明文传输协议,用途是在防火墙中开一道口,让已经授权的用户通过单个端口有能力去访问其中的资源。
socks5协议的工作原理
图解:
正常浏览器访问一个网站,如果不经过代理服务器的话,就会先和对方的网站建立TCP连接,然后三次握手。握手完之后发起 HTTP请求,然后服务返回HTTP响应。
如果设置了代理服务器,流程会变得复杂一些。 首先是浏览器和socks5代理建立TCP连接,socks5代理再和真正的服务器建立TCP连接。这里可以分成四个阶段,握手阶段、认证阶段、请求阶段、relay阶段。
-
第一个握手阶段,浏资器会向socks5代理发送请求,请求包的内容包括一个协议的版本号,还有支持的认证种类 , socks5会选择一个认证方式,返回给浏览器。如果返回的是00的话就代表不需要认证,如果是返回其他类型的话就会开始认证流程。
-
第二个认证阶段(认证流程:第一步,浏览器会给代理服务器发送一个包,这个包有三个字段;第一个字段:version,也就是协议版本号,固定是5;第二个字段:methods,认证的方法数目;第三个字段:每个method的编码,0代表不需要认证,2代表用户名密码认证 此时,代理服务器还需要返回一个response,返回包包括两个字段,一个是version一个是method,也就是我们选中的鉴权方式。)
-
第三个阶段是请求阶段,认证通过之后浏览器会 向socks5发起请求。主要信息包括版本号,请求的类型,一般主要是connection请求,代表希望socks5服务器去和某个域名或者某个IP地址某个端口建立TCP连接, 代理服务器收到响应后,就会和后端服务器建立连接,然后返回响应。
-
第四个阶段是relay转发阶段,此时的浏览器会发送正常发送请求,然后代理服务器接收到请求之后,会直接把请求转换到真正的服务器上。然后如果真正的服务器返回响应的话,也会把响应发送给代理服务器,代理服务器并不关心发送流量的细节,可以是HTTP流量,也可以是其它TCP流量。
curl
curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思。
它的功能非常强大,命令行参数多达几十种。如果熟练的话,完全可以取代 Postman 这一类的图形界面工具。 具体的 这次我用到了这个命令
cur1 --socks5 127.0.0.1:1080 -v http:/www.qq.com