Go 语言的实战案例|青训营笔记
这是我参与「第五届青训营 」笔记创作活动的第1天
一、本堂课重点内容:
通过本节课详解的三个demo,从入门到实操,开始上手 Go 语言。
二、详细知识点介绍:
demo1 猜谜游戏
课堂笔记
- 我们使用rand函数生成随机数之前需要设置随机数种子,否则的话每一次都会生成相同的随机数序列。用启动的时间戳(Unix时间)来初始化随机数种子。
rand.Seed(time.Now().UnixNano()) - 实现用户输入输出,并理解析成数字。
每个程序执行的时候都会打开几个文件,stdin stdout等, stin文件可以用os.Stdin来得到。直接操作这个文件很不方便,我们会用bufio.NewReader把一个文件转换成一个reader变量,reader变量上会有很多用来操作一个流的操作,我们可以用它的ReadString方法来读取一行。如果失败,打印错误并退出。ReadString返回的结果包含结尾的换行符,把它去掉,再转换成数字。如果转换失败,同样打印错误,退出。
reader := bufio.NewReader(os.Stdin) //只读的流
input, err := reader.ReadString('\n') //读取一行 - 字符串操作
input = strings.Trim(input, "\r\n") //去掉换行符
guess, err := strconv.Atoi(input) //转数字
demo2 命令行字典
- 在golang里面,为了避免资源泄露,需要加一个defer来手动关闭流,这个defer会在函数运行结束之后去执行。
- 为把response body来解析出来。在js/Python这些脚本语言里面,body是一个字典或者map的结构,可以直接从里面取值。但是golang是个强类型语言,这种做法并不是最佳实践。更常用的方式是和request的一样,写一个结构体,把返回的SON反序列化到结构体里面。
demo3 Socks5 代理
- socks5协议都是明文传输的,它诞生于互联网早期。其用途是,比如某些企业的内网为了确保安全性,有很严格的防火墙策路,但是带来的副作用就是访问某些资源会很麻烦,socks5相当于在防火墙开了个口子,让授权的用户可以通过单个端口去访问内部的所有资源。
- socks5协议的工作原理。
正常浏览器访问一个网站,如果不经过代理服务器的话,就是先和对方的网站建立TCP连接,然后三次握手 握手完之后发起HTTP请求,然后服务返回HTTP响应。如果设置代理服务器之后,流程会变得复杂一些。 首先是浏览器和socks5代理建立TCP连接,代理再和真正的服务器建立TCP连接。这里可以分成四个阶段,握手阶段、认证阶段、请求阶段、relay 阶段。 第一个握手阶段,浏览器会向socks5代理发送请求,包的内容包括一个协议的版本号,还有支持的认证的种类,socks5服务器会选中一个认证方式,返回给浏览器。如果返回的是0的话就代表不需要认证,返回其他类型的话会开始认证流程。 第三个阶段是请求阶段,认证通过之后浏览器会socks5服务器发起请求。主要信息包括版本号,请求的类型,一般主要是connection请求,就代表代理服务器要和某个域名或者某个IP地址某个端口建立TCP连接。代理服务器收到响应之后,会真正和后端服务器建立连接,然后返回一个响应。 第四个阶段是relay 阶段。此时浏览器会发送正常发送请求,然后代理服务器接收到请求之后,会直接把请求转换到真正的服务器上。然后如果真正的服务器以后返回响应的话,那么也会把请求转发到浏览器这边。然后实际上代理服务器并不关心流量的细节,可以是HTTP流量,也可以是其它TCP流量。
- context机制
三、实践练习例子:
- 修改第一个例子猜谜游戏里面的最终代码,使用fmt.Scanf来简化代码实现——
四、课后个人总结:
- demo2 命令行字典中学习了如何用go语言来来发送HTTP请求、解析json过来,还会学习如何使用代码生成来提高开发效率等。
- demo3 Socks5代理中遇到的几个问题——
- SOCKS5代理-TCP echo server 中,测试运行\go-by-example\proxy\v1\main.go时,powershell执行nc命令,报错——nc : 无法将“nc”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。。原因是未安装netcat工具,安装后执行成功。
- SOCKS5 代理- auth 中,报错测试运行\go-by-example\proxy\v2\main.go"时,powershell执行curl --socks5 127.0.0.1:1080 -v www.qq.com 命令,报错——Invoke-WebRequest : 找不到接受实际参数“127.0.0.1:1080”的位置形式参数。原因是powershell中nvoke-WebRequest命令的写法不同,在cmd中执行该curl命令可以成功运行。