这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
这里只针对个人的理解摘取了一些要重点学习查漏补缺的部分。如果对你有所帮助,将不胜荣幸。
切片
声明:使用make来创建切片,如s := make([]string, 3)。
相关方法调用:
len(s) 获取切片长度
append(s, "a") 在切片末尾添加元素,需要使用 赋值 语句。
原因:slice存储的是长度、容量以及指向数组的指针。如果切片容量不够,就会进行扩容,并返回一个新的数组。
copy(c,s) 将 s 的数值拷贝到 c 中。
map
声明: m := make(map[string]int) ,其中[]中为key的数据类型,后面的是value的类型。
相关方法调用:
delete(m,"one"):删除对应的键值对。
GoLang 中的 map 是完全无序的。
JSON处理
JSON(JavaScript Object Notation, JS对象标记)是一种轻显级的数据交换格式。它基于ECMAScript规范的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。易于人阅读和编写, 同时也易于机器解析和生成,并有效地提升网络传输效率。Go 语言内置了 encoding/json 标准库对 JSON 进行支持。
json.Mashal()
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"]}
注意输出的时候需要进行强制类型转换,否则就会输出16进制的编码。
json.MarshalIndent()
buf, err = json.MarshalIndent(a, "", "\t")
对对象进行格式化,输出结果:
{
"Name": "wang",
"age": 18,
"Hobby": [
"Golang",
"TypeScript"
]
}
json.Unmarshal
err = json.Unmarshal(buf, &b)
Unmarshal函数解析json编码的数据并将结果存入 b 指向的值。
SOCKS5代理实践
对于实战篇,我主要学习了SOCK5代理实践项目。
Socks5协议是一款广泛使用的代理协议,它在使用TCP/IP协议通讯的客户端和服务器之间扮演一个中介角色,使得内部网中的客户端变得能够访问Internet网中的服务器,或者使C/S(Client和Server)之间的通讯更加安全。SOCKS5 代理服务器通过将客户端发来的请求转发给真正的目标服务器, 模拟了一个客户端请求操作。在这里,客户端和SOCKS5代理服务器之间也是通过TCP/IP协议进行通讯,客户端将原本要发送给真正服务器的请求先发送给SOCKS5服务器,然后SOCKS5服务器再将请求转发给真正的服务器。
SOCKS5代理一般分为4个阶段:协商阶段(握手阶段)、认证阶段、请求阶段、relay阶段。
+----+----------+----------+
|VER | NMETHODS | METHODS |
+----+----------+----------+
| 1 | 1 | 1 to 255 |
+----+----------+----------+
VER: 协议版本,socks5为0x05
NMETHODS: 支持认证的方法数量
METHODS: 对应NMETHODS,NMETHODS的值为多少,METHODS就有多少个字节。RFC预定义了一些值的含义,内容如下:
X’00’ NO AUTHENTICATION REQUIRED
X’02’ USERNAME/PASSWORD