Go 语言入门指南:基础语法和常用特性解析 | 青训营

74 阅读3分钟

猜数字

经典入门代码题,通过读取命令行的输入,和随机生成数字对比,输出对应提示

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 件事情

  1. 判断协议是否被支持
  2. 判断能否通过认证,通过后,手动回包
通讯

connect阶段也就两个主要模块

  1. 判断是否这个请求服务的能接受, 判断是什么类型的目标地址并解析
  2. 通信

在客户端和目标进行交互时,这里使用了两个协程,使用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编程充满了热情。