Go语言基础 | 青训营笔记

48 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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