“这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记
1.简介
1.1Go语言的优点
- 高性能、高并发
- 有和cpp、java媲美的性能
- 内建了对高并发的支持,直接使用标准库,或者基于标准库的第三方库即可开发第三方应用程序
- 语法简单、学习曲线平缓
- 丰富的标准库
- 很多情况下不需要依赖第三方库就可以完成功能的开发
- 标准库还很稳定
- 完善的工具链
- 内置了单元测试框架
- 静态链接
- 所有的编译结果默认都是静态链接的,直接拷贝编译成功的可执行文件即可进行部署
- 部署方便快捷
- 快速编译
- 拥有静态语言里面最快的编译速度
- 跨平台
- 可以在windows、linux、macos等平台下运行
- 也可以在路由器、树莓派上运行
- 交叉编译特性,例子:在笔记本上编译出一个二进制文件,可以直接拷贝到路由器上面运行,无需配置交叉编译环境
- 垃圾回收
- 和java类似,无需考虑内存的分配释放
- 可以专注于业务逻辑
1.2那些公司在使用Go语言
go语言的应用领域
- 云计算
- 微服务
- 区块链
- 物联网
- 大数据
在云计算跟微服务上面已经有非常高的市场占有率了
很多云原生组件(docker, k8s, etcd等)很多都是用go语言来实现的
2.入门
2.1搭建go的开发环境
- 安装golang
- 配置golang的编辑器或者ide
- vscode(编辑器) + 插件
- goland(ide)
- 也可以使用云开发环境:gitpod]
2.2基础语法
Hello World
- 通过鼠标悬浮,可以跳到对应的库的在线文档,然后找一些函数或者了解这个库
变量
- 字符串是内置类型,可以直接通过字符串进行拼接
- 运算符的优先级都跟c差不多
- 常量没有确定的类型,根据上下文自动确定类型,关键字
const - 定义变量的方法
- var
- 直接
:=赋值
if else
循环
- 只用一种:for循环
switch
- 不需要加break
- 可以取代if else
数组
- 少用,一般用切片
切片
- 创建切片的方法:
- 用make进行创建
- append
- 注意:append之后要重新赋值给原来的切片
map
- 创建:make
- 无序的
range
- 快速遍历 | | 第一个值 | 第二个值 | | --- | --- | --- | | 数组 | 索引 | 数组的值 | | map | key | value |
函数
指针
- 操作有限
- 主要用途:对常用的参数进行修改
结构体
结构体方法
- 为结构体定义方法
错误处理
- error可以通过
erros.New(" ")进行创建
字符串操作
- strings包
字符串格式化
- 可以用
%v来带引任意类型的变量 - 用
%+v获得更加详细的结果 - 用
%#v更加详细
JSON处理
- 只要结构体里面的变量第一个字母是大写的,那么就可以用json.Marshal去序列化
- 如果想改变序列化之后输出的格式,那么可以在结构体的对应变量的后面加上一个tag,
:后面写上你想要这个字段输出什么样子
序列化之后的结果要用string()才能打印出字符串里面的内容
- 反序列化:json.Unmarshal(),里面用一个结构体变量去接收
时间处理
- time包
- 用
time.Now().Unix()来获取时间戳- 什么叫时间戳?就是用单位为s来表示时间
数字解析
- strconv包
strconv.ParseInt():将字符串转成int类型- 第二个参数,代表转化成多少进制
- 0:代表自动去推测
- 第三个参数:代表精度
- 第二个参数,代表转化成多少进制
strconv.Atoi(""):快速将字符串转成十进制数字- 如果输入不合法,那么就会返回错误
进程信息
- os包
os.Args:获取进程在执行过程中的一些命令行参数os.Getenv():获取环境变量os.Setenv():设置环境变量exec.Command():快速启动子进程并且获取其输入输出
3.实战
3.1猜字谜游戏
- 如果没有设置种子,那么输出的结果永远都是一样的
- 一般怎么设置种子呢?一般用时间戳进行种子的设置
3.1.3读取用户输入
- 老师用了
bufio.NewReader(os.Stdin)的方式读取,比较复杂,但是后面的课程回用到,所以就先学一下这种复杂的方式 - reader.ReadString('\n')读到
\n就停止 - 将字符串类型转成int类型
3.1.4实现判断逻辑
3.1.5实现游戏循环
看老师讲这个项目的感悟,通过看文件版本的比对,看文件增加了些什么,减少了什么,版本前后有什么变化,发生了什么变化。感觉对这个概念更加清晰了
3.2在线词典的介绍
- 命令行版本的词典
- 原理:调用第三方的API去查询单词的翻译并打印出来
- 学习:
- 如何用go语言发送http请求
- 如何使用代码生成,提高开发效率
抓包
- 以彩云翻译为例
- 打开网页后,右键,点击
检查按钮 - 随便写个英文单词,然他进行翻译
- 在network中,从下往上,点击dict按钮,分别查看payload和Preview
代码生成
- 先复制curl请求
- 代码生成网站:curl相关的:curlconverter.com/#go
- 用到json序列化
解析response body
将json格式的代码转成go的格式,自动生成代码网站:oktools.net/json2go
打印结果
- 需要的字段是音标和解释
3.3 SOCKS5代理介绍
- SOCKS5相当于在防火墙内部开了一个口
- 代理ip池,里面很多的都是SOCKS5协议
工作原理
TCP echo server
- 发送什么就回复什么
- nc的安装教程
auth:认证阶段
请求阶段
relay阶段
- go routine
- 标准库中的context机制
- context.WithCancel(context.Background())创建ctx
- ctx.Done()的执行时机是cancel()被调用的时机
- 还可以用插件来进行测试:SwitchyOmega插件
-
- 新建情景模式:输入代理协议、代理服务器、代理端口
-
- 点击应用选项
-
- 点击上面的小图标
- 点击上面的小图标
-
课程总结
- go语言学习路线图
- 课后作业
- SOCKS5有什么好的讲解学习资料
- initialfoo
- 找到第三方的讲解、任意语言的实现,搜索:"go SOCKS5协议"就行了