这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
Day01 第一课 Go基础
讲师:王克纯
一、课程简介
- Go系列课程:基础语言、工程实践、高质量编程与性能调优、发行版优化与落地实践
- 基础语言:猜谜游戏、命令行词典、SOCKS5代理
二、课堂笔记
1.基础
1.1什么是Go语言
高性能、高并发:和C/C++媲美的性能、调用标准库实现高并发语法简单、学习曲线平缓:10行实现http服务器丰富的标准库完善的工具链:编译、代码格式化、单元测试框架静态链接快速编译跨平台垃圾回收
1.2哪些公司在用Go
字节、腾讯、百度、谷歌、美团、滴滴等
1.3为什么用Go
1.最初使用的Python,由于性能问题换成了Go 2.C++不太适合在线 Web业务 3.早期团队非Java背景 4.性能比较好 5.部署简单、学习成本低 6. 内部 RPC和 HTTP框架的推广
2.入门
2.1开发环境
- 安装Golang
- VsCode/Goland
- Github下载example代码
2.2基础语法
- Hello World
- 变量
var a =f :=const s string =
- ifelse
- 没有()
- 必须一行,后接{
- 循环
- 只有for
- 没有()
- switch
- 不需要break
- 可以简化ifelse
- 数组
var a [5]int
- 切片(常用)
- 长度可变
- 创建:
s := make([]string, 3) - 追加append
- 左闭右开
- map
- 创建:
m := make(map[string]int) - 是否存在:
r, ok := m["unknow"]
- 创建:
- range
- 遍历返回索引和值
- 函数
- 遍历类型后置
- 返回两个值:1.真正返回值;2.错误信息
- 指针
- 默认拷贝传参,需要加* 引用传递
- 结构体
- 对应类
- 结构体方法
- 对应类成员函数
- 错误处理
- 返回值加
err error
- 返回值加
- 字符串操作
ContainsCount- ...
- 字符串格式化
printf的%v(%+v、%#v)
- JSON处理
- 结构体中的变量名首字母大写
- 序列化
json.Marshal() - 打印时需要
string()
- 时间处理
time.Now()time.Date().Unix()获取时间戳
- 数字解析
import strconvParseInt(字符串, 进制, 精度)
- 进程信息
import osos.Argsos.Getenv("PATH")
3.实战
3.1猜谜游戏
- Q1:Invalid input. Please enter an integer value
- A1:Win环境需要
\r\n:input = strings.TrimSuffix(input, "\r\n")
3.2在线词典
- 调用彩云翻译的api(兴奋)
fanyi.caiyunapp.com - 生成代码,解析request body
curlconverter.com/#go - defer会在函数结束后从下往上出发,关闭流,防止内存泄漏
- 生成代码,解析response body
oktools.net/json2go - 运行-命令行
go run simpleDict/v4/main.go walnut
3.3SOCKS5代理
- 代理:用于提供单一接口,访问公司内部网
- 工作原理,四个阶段:
- (1)协商/握手阶段
- 认证方式
- 跳过,因为实现的是不加密代理
- (2)认证阶段
- (3)请求阶段
- (4)relay阶段
- 转发响应结果
- (1)协商/握手阶段
- TCP echo server实现
process处理连接go关键字,减小开销,轻松处理上万并发- bufio.NewReader带缓冲的字节流
- 先读1KB,再1字节1字节地读
nc 127.0.0.1 1080?- Q1:无法将“nc”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
- A1:??(要配置go mod proxy后重启,才能代码补全)
- Q2:PowerShell执行,报错:main.go:4:2: package bufio is not in GOROOT
- A2:??
- auth
curl --socks5 127.0.0.1:1080 -v http://www.qq.com
- request
- 这部分优点没学明白
- relay
copy(dst, src)是单向拷贝,所以需要两个go func(){}- 采用context.WithCancel(),这样出错时可以及时cancel()关闭
- Q3:找不到接受实际参数“127.0.0.1:1080”的位置形式参数。
- A3:??
EX.Q&A
- Go学习路线图
- 课后作业
- 建议按行读取,不要scanf
- alt+点击结构,可以跳读源码
-
- Q:请问go的字符串拼接效率问题,一般考虑到综合易用性和性能,推荐使用 strings.Builder 来拼接字符串。但为什么有的文章会说标准编译器对使用+运算符的字符串衔接做了特别的优化。 所以,一般说来,在被衔接的字符串的数量是已知的情况下,使用+运算符进行字符串衔接是比较高效的。请问下一般在项目中如何拼接字符串是比较高效合理的呢
- A:(1)写代码不建议一开始就性能优化。(2)建议strings.Builder拼接。+确实有优化。
- cmd和Bash不一样,会导致问题
- SOCKS5协议的讲解
三、心得体会
- 知识点密集,不罗嗦不废话,几秒一个点
- 在线词典的实战很吸引我,因为调用了在线网页的功能