GO语言工程实践课后作业:实现思路、代码以及路径记录| 豆包MarsCode AI 刷题

60 阅读4分钟

通过学习第一段代码,我学会了如何使用Go语言编写一个简单的猜数字游戏。代码导入了多个标准库包,如 bufiofmtmath/randosstrconvstrings,这些包分别用于输入输出、随机数生成、字符串处理等功能。通过 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语言编写一个简单的在线词典查询程序。代码首先导入了多个标准库包,如 bytesencoding/jsonfmtio/ioutillognet/httpos,这些包分别用于处理字节缓冲、JSON编码解码、格式化输出、文件操作、日志记录、HTTP请求和操作系统交互。

  1. 定义数据结构

    • DictRequest 结构体用于构建发送给API的请求数据,包含翻译类型、源单词和用户ID。
    • DictResponse 结构体用于解析API返回的响应数据,包含返回码、维基百科信息、字典信息等。
  2. 构建HTTP请求

    • 使用 json.Marshal 将 DictRequest 结构体序列化为JSON格式。
    • 使用 bytes.NewReader 创建一个读取器对象,将JSON数据传递给HTTP请求。
    • 使用 http.NewRequest 创建一个POST请求,设置请求URL和请求体。
    • 设置请求头,包括连接保持、用户代理、授权令牌等。
  3. 发送HTTP请求

    • 使用 http.Client 发送HTTP请求,并获取响应。
    • 检查响应状态码,如果不是200,记录错误并退出程序。
    • 使用 ioutil.ReadAll 读取响应体内容。
  4. 解析响应数据

    • 使用 json.Unmarshal 将响应体内容反序列化为 DictResponse 结构体。
    • 打印单词的英式和美式发音。
    • 遍历并打印单词的解释列表。
  5. 主函数

    • 检查命令行参数,确保用户提供了要查询的单词。
    • 调用 query 函数,传入用户提供的单词进行查询。

通过学习这段代码,我掌握了如何使用Go语言实现一个简单的SOCKS5代理服务器。代码详细展示了如何处理客户端的连接请求、进行身份验证、解析请求头并建立目标连接,最后进行双向数据传输。以下是具体的总结:

代码结构和主要功能

代码首先导入了多个标准库包,如 bufiocontextencoding/binaryerrorsfmtiolognet,这些包分别用于处理缓冲读写、上下文管理、二进制数据处理、错误处理、格式化输入输出、I/O操作和网络通信。代码定义了SOCKS5协议的一些常量,如版本号、命令类型和地址类型。

主要函数和流程

  1. 主函数 (main)

    • 使用 net.Listen 绑定TCP监听地址 127.0.0.1:1080
    • 进入一个无限循环,接受客户端连接。
    • 每次接受到一个新的连接,启动一个新的goroutine调用 process 函数处理该连接。
  2. 处理客户端连接 (process)

    • 关闭连接后调用 defer conn.Close()
    • 使用 bufio.NewReader 创建一个读取器对象。
    • 调用 auth 函数进行身份验证。
    • 调用 connect 函数处理连接请求。
  3. 身份验证 (auth)

    • 读取客户端发送的版本号、方法数量和方法列表。
    • 检查版本号是否为 socks5Ver
    • 回复客户端,表示支持无认证方法。
  4. 处理连接请求 (connect)

    • 读取客户端发送的请求头,包括版本号、命令类型、保留字段、地址类型、目标地址和目标端口。
    • 检查版本号是否为 socks5Ver,命令类型是否为 cmdBind
    • 根据地址类型解析目标地址。
    • 解析目标端口号。
    • 使用 net.Dial 建立到目标地址的连接。
    • 向客户端回复成功消息。
    • 使用 io.Copy 在客户端和目标地址之间进行双向数据传输。
    • 使用 context.WithCancel 管理两个数据传输goroutine的生命周期