Go实践 | 青训营笔记

77 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

title: go实战案例
date: 2023-01-15 15:43:18
categories: go

随机数生成

需要"math/rand"包,示例:

maxNum := 100
secretNumber := rand.Intn(maxNum)

和c/cpp一样,这样的随机数每次运行都不变

做以下改进,加入"time"包:

maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)

这样就可以用时间戳初始化随机数种子,每次运行时产生的随机数就是不同的了。

读取用户输入

先不考虑使用scanf的简洁写法,这里需要使用bufio、os、strconv、strings包(fmt默认有)

reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')
if err != nil {
        fmt.Println("An error occured while reading input. Please try again", err)
        return
}
input = strings.TrimSuffix(input, "\n")//去掉换行符
​
guess, err := strconv.Atoi(input)//转为数字
if err != nil {
    fmt.Println("Invalid input. Please enter an integer value")
    return
}
fmt.Println("You guess is", guess)

bufio包通过缓冲提高io效率。io频繁访问本地磁盘文件时效率会低,bufio提供缓冲区,读写都在缓冲区中,最后再读写文件,降低访问本地磁盘次数,从而提高效率。(适用于多次改动,最后提交)

ReadString将输入变为流?,TrimSuffix类成员函数和Atoi类成员函数分别起到去掉换行符和将字符串转换成数字的操作。

Go发送http请求,解析json

代码生成

curlconverter.com/go/这个网址将发送请求的json转化成代码

序列化

oktools.net/json2go读取json文件生成数据结构

SOCKS5代理

工作原理

正常浏览器访问网站:建立TCP连接,三次握手,握手完成后,发起http请求,服务器返回http响应,过程简单。 涉及代理服务器:浏览器先和socks5代理服务器建立TCP连接,代理服务器再和真正的服务器建立TCP连接,总共可以分为4个阶段:

  1. 协商或握手阶段 用户浏览器向代理服务器发送报文(包括协议版本号、支持的认证种类),代理服务器返回推荐的认证种类
  2. 认证阶段 这里实现的是不加密的代理,所以跳过认证阶段
  3. 请求阶段 浏览器向代理服务器发送下一个报文(包括协议版本号、请求的类型),代理收到响应后和后端服务器建立TCP连接,然后返回报文告诉用户连接状态。
  4. relay阶段 代理服务器作为用户浏览器和目的浏览器的中转发送两者之间的信息。

这节课三个实战项目让我们在实践中掌握学到的go基础,非常有用,但从理解到熟练掌握还有一段距离,课后作业也能让我们更快速掌握所学知识。