Go作业完成知识点笔记|青训营笔记

132 阅读5分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第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}

通用占位符

image.png

其它的还有各种占位符以后用到就知道了。

宽度标识符占位符说明
%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"

image.png

SOCKS5代理服务器

SOCKS5协议是明文传输协议,用途是在防火墙中开一道口,让已经授权的用户通过单个端口有能力去访问其中的资源。

socks5协议的工作原理

图解:

image.png

正常浏览器访问一个网站,如果不经过代理服务器的话,就会先和对方的网站建立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