Go语言上手-基础语法 | 青训营笔记

147 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第 1 篇笔记。

本篇笔记对第一节课《Go语言上手-基础语法》的学习作出知识总结

Go 语言特点

  1. 高性能,高并发
  2. 语法简单,易上手
  3. 丰富的标准库,有很高的兼容性
  4. 完善的工具链,完整的单元测试框架、性能测试等
  5. 编译结果默认是静态链接
  6. 可以快速编译
  7. 跨平台,能够实现IOS、Android等开发
  8. 有垃圾回收机制,可以只关注业务逻辑

基础语法

课上主要对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
		}
	}

在线词典

实现流程:

  1. 选择在线翻译网页(彩云翻译)
  2. 抓取单词翻译的http请求包,并复制出cURL代码,使用cURL在线转换为golang代码(创建请求、设置请求头、发起请求、读取响应)
  3. 生成request body
  4. 解析response body

具体代码可参考前文给出的代码地址。

Socks5代理

Socks5代理的实现原理:

image.png

  1. 协商阶段:客户端浏览器向Socks5代理服务器发送请求报文,包含协议版本号、支持认证的类型等
  2. 发送请求:浏览器向服务器再次发送报文,包含协议版本号、请求类型
  3. 发送数据

实现简单的TCP Echo Server:

功能:向服务器发送什么,服务器就会返回什么。

  1. 首先,用 net.listen 去监听服务器端口,会返回一个 server。
  2. 然后在死循环中用 server.Accept() 接收请求,如果成功则建立连接。
  3. 在 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")
	}
}

认证阶段:

  1. 实现 auth() 函数,在 process() 中调用
  2. 浏览器给代理服务器发送的报文包含三个字段:version,协议版本号(固定是5);nmethods,认证的方法数量;methods,每个方法的编码(0:不需要认证,2:需要用户名密码认证)

请求阶段:

请求阶段,认证通过之后议览器会socks5服务器发起请求。主要信息包括版本号,请求的类型,一般主要是cometion请求,就代表代理服务器要和某个域名或者某个Р地址某个饿D建立TCP 连接。代理服务器收到响应之后,会真正和后端服努器建立连接,然后返回一个响应。

relay阶段:

此时刘览器会发送正常发送清求,然后代理服务器接收到情求之后,会直接把请求转换到真正的服务器上。然后如果真正的服务器以后返回响应的话,那么也会把清求转发到浏览器这边。实际上代理服务器并不关心流量的细节,可以是HTTP流量,也可以是其它TCP流量。