这是我参与「第三届青训营 -后端场」笔记创作活动的的第 1 篇笔记。
本篇笔记对第一节课《Go语言上手-基础语法》的学习作出知识总结
Go 语言特点
- 高性能,高并发
- 语法简单,易上手
- 丰富的标准库,有很高的兼容性
- 完善的工具链,完整的单元测试框架、性能测试等
- 编译结果默认是静态链接
- 可以快速编译
- 跨平台,能够实现IOS、Android等开发
- 有垃圾回收机制,可以只关注业务逻辑
基础语法
课上主要对Go语言常用的20种语法进行讲授,放出代码项目链接供以后查阅:github.com/wangkechun/…
实战练习
猜数游戏
这个练习没有什么需要着重说明的,主要是命令行的读取与输出、对字符串值的操作等,值得注意的是调用 rand.Seed() 随机数种子,让每次出来的随机数不同。下面附上实现代码:
maxNum := 100
rand.Seed(time.Now().UnixNano()) // 随机数种子,让每次出来的随机数不同
secretNumber := rand.Intn(maxNum)
//fmt.Println("The secret number is ", secretNumber)
fmt.Println("Input your guess number:")
reader := bufio.NewReader(os.Stdin)
for {
input, err := reader.ReadString('\n') // 读取一行输入
if err != nil {
fmt.Println("An error occurred while reading input.", err)
continue
}
input_1 := strings.TrimSuffix(input, "\r\n") // 去掉换行符
guess, err := strconv.Atoi(input_1) // 转换成数字
if err != nil {
fmt.Println("Invalid input.", err)
continue
}
fmt.Println("Your guess is", guess)
// 实现判断逻辑
if guess > secretNumber {
fmt.Println("Your guess is bigger than secret number. Try again.")
} else if guess < secretNumber {
fmt.Println("Your guess is smaller than secret number. Try again.")
} else {
fmt.Println("Congratulation! Your guess is correct")
break
}
}
在线词典
实现流程:
- 选择在线翻译网页(彩云翻译)
- 抓取单词翻译的http请求包,并复制出cURL代码,使用cURL在线转换为golang代码(创建请求、设置请求头、发起请求、读取响应)
- 生成request body
- 解析response body
具体代码可参考前文给出的代码地址。
Socks5代理
Socks5代理的实现原理:
- 协商阶段:客户端浏览器向Socks5代理服务器发送请求报文,包含协议版本号、支持认证的类型等
- 发送请求:浏览器向服务器再次发送报文,包含协议版本号、请求类型
- 发送数据
实现简单的TCP Echo Server:
功能:向服务器发送什么,服务器就会返回什么。
- 首先,用 net.listen 去监听服务器端口,会返回一个 server。
- 然后在死循环中用 server.Accept() 接收请求,如果成功则建立连接。
- 在 process() 中处理该连接。
func main() {
server, err := net.Listen("tcp", "127.0.0.1:1080")
if err != nil {
panic(err)
}
for {
client, err := server.Accept()
if err != nil {
log.Printf("Accept failed %v", err)
continue
}
fmt.Println("Server Listen")
go process(client)
}
}
func process(conn net.Conn) {
defer conn.Close()
reader := bufio.NewReader(conn)
for {
b, err := reader.ReadByte()
if err != nil {
break
}
_, err = conn.Write([]byte{b})
if err != nil {
break
}
fmt.Println("go process")
}
}
认证阶段:
- 实现 auth() 函数,在 process() 中调用
- 浏览器给代理服务器发送的报文包含三个字段:version,协议版本号(固定是5);nmethods,认证的方法数量;methods,每个方法的编码(0:不需要认证,2:需要用户名密码认证)
请求阶段:
请求阶段,认证通过之后议览器会socks5服务器发起请求。主要信息包括版本号,请求的类型,一般主要是cometion请求,就代表代理服务器要和某个域名或者某个Р地址某个饿D建立TCP 连接。代理服务器收到响应之后,会真正和后端服努器建立连接,然后返回一个响应。
relay阶段:
此时刘览器会发送正常发送清求,然后代理服务器接收到情求之后,会直接把请求转换到真正的服务器上。然后如果真正的服务器以后返回响应的话,那么也会把清求转发到浏览器这边。实际上代理服务器并不关心流量的细节,可以是HTTP流量,也可以是其它TCP流量。