通过学习第一段代码,我学会了如何使用Go语言编写一个简单的猜数字游戏。代码导入了多个标准库包,如 bufio、fmt、math/rand、os、strconv 和 strings,这些包分别用于输入输出、随机数生成、字符串处理等功能。通过 rand.Seed(time.Now().UnixNano()) 初始化随机数生成器,并使用 rand.Intn(maxNum) 生成一个0到 maxNum-1 之间的随机整数作为秘密数字。用户输入通过 bufio.NewReader(os.Stdin) 读取,并使用 reader.ReadString('\n') 获取一行输入,再通过 strings.Trim(input, "\r\n") 去除输入字符串两端的换行符和回车符。输入的字符串通过 strconv.Atoi(input) 转换为整数,如果转换失败或输入无效,会提示用户重新输入。通过 if-else 语句判断用户的猜测与秘密数字的关系,给出相应的提示,直到用户猜中秘密数字并结束循环。这段代码展示了随机数生成、用户输入处理、错误处理、字符串处理和类型转换等多个知识点。
通过学习这段代码,我掌握了如何使用Go语言编写一个简单的在线词典查询程序。代码首先导入了多个标准库包,如 bytes、encoding/json、fmt、io/ioutil、log、net/http 和 os,这些包分别用于处理字节缓冲、JSON编码解码、格式化输出、文件操作、日志记录、HTTP请求和操作系统交互。
-
定义数据结构:
DictRequest结构体用于构建发送给API的请求数据,包含翻译类型、源单词和用户ID。DictResponse结构体用于解析API返回的响应数据,包含返回码、维基百科信息、字典信息等。
-
构建HTTP请求:
- 使用
json.Marshal将DictRequest结构体序列化为JSON格式。 - 使用
bytes.NewReader创建一个读取器对象,将JSON数据传递给HTTP请求。 - 使用
http.NewRequest创建一个POST请求,设置请求URL和请求体。 - 设置请求头,包括连接保持、用户代理、授权令牌等。
- 使用
-
发送HTTP请求:
- 使用
http.Client发送HTTP请求,并获取响应。 - 检查响应状态码,如果不是200,记录错误并退出程序。
- 使用
ioutil.ReadAll读取响应体内容。
- 使用
-
解析响应数据:
- 使用
json.Unmarshal将响应体内容反序列化为DictResponse结构体。 - 打印单词的英式和美式发音。
- 遍历并打印单词的解释列表。
- 使用
-
主函数:
- 检查命令行参数,确保用户提供了要查询的单词。
- 调用
query函数,传入用户提供的单词进行查询。
通过学习这段代码,我掌握了如何使用Go语言实现一个简单的SOCKS5代理服务器。代码详细展示了如何处理客户端的连接请求、进行身份验证、解析请求头并建立目标连接,最后进行双向数据传输。以下是具体的总结:
代码结构和主要功能
代码首先导入了多个标准库包,如 bufio、context、encoding/binary、errors、fmt、io、log 和 net,这些包分别用于处理缓冲读写、上下文管理、二进制数据处理、错误处理、格式化输入输出、I/O操作和网络通信。代码定义了SOCKS5协议的一些常量,如版本号、命令类型和地址类型。
主要函数和流程
-
主函数 (
main) :- 使用
net.Listen绑定TCP监听地址127.0.0.1:1080。 - 进入一个无限循环,接受客户端连接。
- 每次接受到一个新的连接,启动一个新的goroutine调用
process函数处理该连接。
- 使用
-
处理客户端连接 (
process) :- 关闭连接后调用
defer conn.Close()。 - 使用
bufio.NewReader创建一个读取器对象。 - 调用
auth函数进行身份验证。 - 调用
connect函数处理连接请求。
- 关闭连接后调用
-
身份验证 (
auth) :- 读取客户端发送的版本号、方法数量和方法列表。
- 检查版本号是否为
socks5Ver。 - 回复客户端,表示支持无认证方法。
-
处理连接请求 (
connect) :- 读取客户端发送的请求头,包括版本号、命令类型、保留字段、地址类型、目标地址和目标端口。
- 检查版本号是否为
socks5Ver,命令类型是否为cmdBind。 - 根据地址类型解析目标地址。
- 解析目标端口号。
- 使用
net.Dial建立到目标地址的连接。 - 向客户端回复成功消息。
- 使用
io.Copy在客户端和目标地址之间进行双向数据传输。 - 使用
context.WithCancel管理两个数据传输goroutine的生命周期