猜数字
经典入门代码题,通过读取命令行的输入,和随机生成数字对比,输出对应提示
bufio库的使用
reader := bufio.NewReader(os.stdin)
input, err := reader.ReadString('\n')
通过具有缓冲的bufio库来进行io操作,提高效率
简单字典
通过对固定api发送请求,解析响应,输出所需信息
字符串解析
strconv库
主要是字符和其他类型的转化
strconv.Atoi(s string) int
转换 string to int
strings库
字符操作
strings.TrimSuffix(s string , suffix string) string
删除末尾字符, 如果没有就正常返回
网络请求
go进行请求有一般两种方式,一种是调用net/http中的Post/Get方法,这种方法快捷,但在细节处理上不行,比如没有设置头参数,cookie的方法,第二种是用NewRequest方式,构造一个请求发送,处理起来稍微麻烦点,但能应付更多场景,这里是使用了第二种,之后在后续作业里,会使用第一种
NewRequest方式
初始化请求客户端
client := &http.Client{}
var data = bytes.NewReader(buf) //通过结构体和Json解析得到
req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)
构造头
req.Header.Set("authority", "api.interpreter.caiyunai.com")
req.Header.Set("accept", "application/json, text/plain, */*")
解析请求
resp, err := client.Do(req)
bodyText, err := io.ReadAll(resp.Body)
err = json.Unmarshal(bodyText, &dictResponse)
os参数库
这里通过外部位置传递参数
word := os.Args[1]
// go run main.go hello
// os.Args[0] = main.go
// os.Args[1] = hello
// os.Args[2] = ...
socks5代理
将所有的包通过代理服务器发出,之间的协议用socks5,主要分为两步:
- 鉴权
- 通讯
鉴权
在这个阶段我们要做 2 件事情
- 判断协议是否被支持
- 判断能否通过认证,通过后,手动回包
通讯
connect阶段也就两个主要模块
- 判断是否这个请求服务的能接受, 判断是什么类型的目标地址并解析
- 通信
在客户端和目标进行交互时,这里使用了两个协程,使用context库进行交互
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
go func() {
_, _ = io.Copy(dest, reader)
cancel()
}()
go func() {
_, _ = io.Copy(conn, dest)
cancel()
}()
<-ctx.Done()
当有一边读取不到东西阻塞后, 用 cancel() 将两个进程都关闭
思考与感悟
在初入门Go编程的过程中,我深刻体会到了编程语言的强大和灵活性。从猜数字游戏的简单交互,到与API进行通信解析信息,再到实现SOCKS5代理的复杂通讯,每一步都展示了Go语言的优势。通过bufio、strconv和strings等库的使用,我领略到了高效处理输入输出和字符串操作的便利。而对网络请求的处理则让我明白了灵活性和细节处理的重要性,选择适当的方法能更好地满足不同场景的需求。最让我印象深刻的是在SOCKS5代理中,通过协程和context库的组合,实现了高效的并发通讯处理,展示了Go在并发编程方面的优势。这段学习经历不仅让我掌握了Go语言的基础知识,更培养了我解决问题和编程思维的能力。我对继续深入学习和探索Go编程充满了热情。