Go语言可以说是结合了C语言和python的部分优势,具有一些特点:高性能、高并发,简单易懂的语法,丰富的标准库,强大的工具链,静态编译快速编译,跨平台支持,垃圾回收。
语法方面拥有C语言和python基础的我并不难掌握:
这里附上一段代码看读者是否了解:
package main
import "fmt"
func main() {
// 数组
var arr [5]int
arr[0] = 1
arr[1] = 2
fmt.Println(arr) // [1 2 0 0 0]
// 切片
slice := make([]int, 0)
slice = append(slice, 1)
slice = append(slice, 2)
fmt.Println(slice) // [1 2]
}
实践课上涉及了三个实际案例:
一、构建一个简单的猜数字游戏的步骤和实现过程。
1.生成随机数:使用Go语言的rand包和time包,通过设置随机数种子,生成一个随机数,并打印到屏幕上。
2.用户输入输出:使用Go语言的bufio包将标准输入(os.Stdin)转换成可读取的缓冲区,并从中读取用户输入的数字。将读取的字符串转换为整数,并处理转换错误。
3.比较数字:将用户输入的数字与随机生成的数字进行比较,提示用户是猜的数字高于还是低于秘密的随机数。
4.循环游戏:为了让游戏可以持续进行,将整个猜数字过程放入一个循环中。如果猜对数字,则提示用户胜利并退出游戏,否则继续循环猜数。
二、实现一个命令行版本的词典:这个词典可以在命令行中输入一个单词,然后通过调用第三方API查询该单词的音标和解释,并输出到命令行中。
实现步骤概括如下:
1. 打开在线翻译网页,右键浏览器检查,查看POST请求的参数,找到需要发送的API请求。
2. 使用代码生成工具将浏览器中的请求字符串转换为Go语言中的代码。
3. 发送HTTP请求到API并获取返回的JSON响应。
4. 使用代码生成工具将返回的JSON响应转换为Go语言中的结构体。
5. 解析返回的JSON响应,提取出音标和解释信息,并输出到命令行中。
6. 构建命令行参数处理逻辑,接收用户输入的单词,并调用相应的函数查询并输出结果。
值得注意的是这个例子讲解了如何发送HTTP请求并解析JSON数据,以及如何利用代码生成工具简化代码编写过程。该例子是一个简单的命令行词典,为接下来更复杂的项目打下了基础。
三、根据上述讲解的内容,梳理出实现一个简化版的代理服务器的步骤如下:
1. 创建TCP Server:首先,创建一个TCP服务器,监听指定的端口,用于接收来自浏览器的连接请求。
2. 连接接受处理:在主循环中,接受来自浏览器的连接请求,并返回一个连接对象,表示与浏览器的通信通道。
3. 协议版本和认证阶段:从浏览器发送的请求报文中,解析协议版本和认证方式。验证协议版本是否正确。如果需要认证,按照协议要求,进行认证流程。
4. 请求阶段:从浏览器发送的请求报文中,解析出请求类型、目标地址类型、目标地址和端口号。根据目标地址类型和目标地址创建TCP连接。返回代理服务器对连接的响应报文,告知浏览器建立连接成功或失败。
5. 双向数据转发:一旦与下游服务器建立了TCP连接,启动两个协程或线程进行双向数据转发。一个协程从浏览器读取数据,然后将其写入与下游服务器的连接。另一个协程从下游服务器读取数据,然后将其写入与浏览器的连接。
6. 错误处理:在数据转发的过程中,任何一方出现错误(如连接关闭)时,终止整个连接,关闭所有相关的连接。
7. 完善协议支持:考虑完善协议支持,支持更多的认证方式和目标地址类型。
8. 调试和测试:运行代理服务器,并进行测试,验证是否可以正确地与浏览器和下游服务器进行双向数据转发。
9. 配置浏览器使用代理服务器:在浏览器中配置代理服务器的地址和端口,以便使用代理服务器进行访问。
上述是一个简化版的代理服务器实现步骤,实际的代理服务器可能涉及更多的细节和协议支持。同时,代理服务器的实现还需要考虑安全性和性能等方面的问题。
总结:学习Go语言是一次非常愉快和有意义的经历。它不仅让我掌握了一门新的编程语言,还为我提供了解决实际问题的强有力工具。我期待着在未来能够继续深入学习和应用Go语言,将其应用于更多的项目和领域中。