大家好,我是编程小6,很高兴遇见你,有问题可以及时留言哦。
第五届字节跳动青训营讲师非常用心给大家整理了课前、中、后的学习内容,同学们自我评估,选择性查漏补缺,便于大家更好的跟上讲师们的节奏,祝大家学习愉快,多多提问交流~
本节课程主要分为四个方面:
课前部分主要罗列课程中涉及到的概念。对于不熟悉的概念,同学们可以提前查询预习;课中部分主要罗列每一部分的关键思路,帮助同学们跟上课程的进度;课后部分是一些问题,帮助同学们在课后梳理本课程的重点。
可以选择安装 VS Code , 或者 Goland ,对于 VS Code,需要安装 Go 插件
go run example/01-hello/main.go
如果正确输出 hello world,则说明环境配置正确空余时间阅读 Go语言圣经(中文版)
Go 语言学习路线图
本节课程主要分为四个方面:
属于编程进阶内容,考虑到工程项目的可用性和可靠性,工程实践中经常会用到。
了解Go依赖管理演进的历程,通过课程学习以及课后实践能能够熟练使用go module 管理依赖。
需求模型来源
青训营话题页【后端专场 学习资料一】第五届字节跳动青训营
需求
组件及技术点
web框架:Gin - github.com/gin-gonic/g…
分层结构设计:github.com/bxcodec/go-…
文件操作:读文件pkg.go.dev/io
数据查询:索引www.baike.com/wikiid/5527…
搭建课程所需要的开发环境以及安装需要用到的软件。
安装 Minikube 或 Docker Desktop 用于使用 Docker 安装教程
安装 Postman
安装 Git 安装教程
安装 Go(Golang >= 1.15) 安装教程
提前体验一下课程涉及的 HTTP/RPC/ORM 框架
通过阅读 www.cloudwego.io/zh/docs/her… 尝试运行 Hertz 的示例代码
通过阅读 www.cloudwego.io/zh/docs/kit… 尝试运行 Kitex 的示例代码
通过阅读 gorm.cn/docs/#Insta… 尝试运行 Gorm 的示例代码
- 了解一下什么IDL以及IDL的语法
- 了解一下什么是 opentracing 以及 etcd
了解 etcd 是什么 参考文档
了解 opentracing 是什么 参考文档
了解 IDL 是什么 zh.m.wikipedia.org/zh-hans/%E6…
Thrift IDL 语法 thrift.apache.org/docs/idl
proto3 IDL 语法 developers.google.com/protocol-bu…
总结
注释应该解释代码作用
注释应该解释代码如何做的
注释应该解释代码实现的原因
公共符号始终要注释
总结
variable
function
package
总结
尽量保持正常代码路径为最小缩进,优先处理错误情况/特殊情况,并尽早返回或继续循环来减少嵌套,增加可读性
总结
简单错误处理
错误的 Wrap 和 Unwrap
Go1.13 在 errors 中新增了三个新 API 和一个新的 format 关键字,分别是 errors.Is、errors.As 、errors.Unwrap 以及 fmt.Errorf 的 %w。如果项目运行在小于 Go1.13 的版本中,导入 golang.org/x/xerrors 来使用。以下语法均已 Go1.13 作为标准。
错误判定
panic
recover
总结
在尽可能的情况下,在使用 make() 初始化切片时提供容量信息,特别是在追加切片时
原理
ueokande.github.io/go-slice-tr…
切片本质是一个数组片段的描述,包括了数组的指针,这个片段的长度和容量(不改变内存分配情况下的最大长度)
切片操作并不复制切片指向的元素,创建一个新的切片会复用原来切片的底层数组,因此切片操作是非常高效的
切片有三个属性,指针(ptr)、长度(len) 和容量(cap)。append 时有两种场景:
因此,为了避免内存发生拷贝,如果能够知道最终的切片的大小,预先设置 cap 的值能够获得最好的性能
另一个陷阱:大内存得不到释放
原理
常见的字符串拼接方式
strings.Builder 最快,bytes.Buffer 较快,+ 最慢
原理
空结构体不占据内存空间,可作为占位符使用
比如实现简单的 Set
原理
性能调优原则
性能调优的核心是性能瓶颈的分析,对于 Go 应用程序,最方便的就是 pprof 工具
github.com/wolfogre/go…
前置准备,熟悉简单指标,能够编译运行 pprof 测试项目
实际分析排查过程
排查 CPU 问题
命令行分析
top 命令
list 命令
熟悉 web 页面分析
调用关系图,火焰图
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/cpu"
排查堆内存问题
排查协程问题
排查锁问题
排查阻塞问题
流程
建立压测评估链路
分析性能火焰图,定位性能瓶颈
重点优化项分析
上线验证评估
进一步优化,服务整体链路分析
适应范围更广,覆盖更多服务
AB 实验 SDK 的优化
适应范围最广,Go 服务都有收益
优化方式