PlayGocode
A better playground to Golang, Try it
基础教程
Linux 基础教程
介绍 linux 的基本概念,环境搭建和基本的 shell 知识,以及一些使用案例,掌握基本的 linux 知识是开发/运维的基础。
Vim 基础教程
在日常开发和运维的过程中,经常需要在字符终端界面编辑配置/日志文件,可以使用 nano、vim、emacs 等,推荐使用 vi。
Git 基础教程
去中心化的分布式版本库管理工具,适合于任意大小的项目,熟练掌握 git 的各种命令,是团队协作的基础,也是参与开源项目必备的技能。
Go 语言基础教程
介绍 golang 语言的各个特性和标准库,目前共有 32 章,从基本的 syntax、slice、struct、map、func、goroutine 到 cgo/rpc/solid principle 等高级话题均有涉及,某些知识点结合程序基础、网络有少许延伸,文字是口水话/大白话风格,力求简单、直接、高效,主要面向 golang 的初学者,但必须有其他编程语言的经验。
Go 版本主要特性
自从 golang 1.18 以后的版本升级后的主要特性以及项目中要特别关注的点。
基础示例
开启 Go Modules 支持
需要对 go env 进行基本的设置。
坚持编写单元测试
Golang 支持 5 种测试类型:
- 测试函数,函数名前缀是 Test,比如
func TestSayHello(t testing.T) {}
,用于基本的功能测试 - 基准函数,函数名前缀是 Benchmark,比如
func BenchmarkFib(b *testing.B) {}
,用于测试代码运行的时间以及占用的 cpu/memory 等数据 - Main 函数测试,函数名是 TestMain,比如
func TestMain (m *testing.M)
,可以控制测试的启动(初始化)和结束(释放资源) - 示例函数,函数名前缀是 Example,比如
func ExampleIsOdd() {}
,示例函数嵌入在文档中看起来是注释,但其实是真是的 go 代码,接受编译器的检查 - 模糊测试,函数名前缀是 Fuzz,比如
func FuzzReverse(f *testing.F) {}
,用于构造随机数据来测试代码的漏洞和边界,以及导致 crash 的输入情况
理解 make 和 new 操作
built 的 make 和 new 函数都是创建对象并分配内存。
错误捕捉和习惯约定
表达 error 错误是 golang 里必须要认真对待的。
时间解析和格式化
无论任何编程语言,时间机制的复杂度超过你的想象,不正确的时间转换处理是 bug 频发的原因之一。
结构体 struct 的特性
通过定义 struct 的方式可以申明新的类型,结构体的成员也可以是复合类型,通过内嵌结构体配合接口拥有良好的扩展性和灵活性。
键值对 map 的特性
Map 是一种无序的键值对的集合,通过 key 来快速检索数据,key 类似于索引,可以像迭代数组和切片那样迭代它,不过 Map 是无序的,我们无法决定它的返回顺序,因为 Map 是使用 hash 表来实现的。
函数特性和返回值
在 Golang 里函数依然是一等公民,合理的组织和拆分函数可以写出可维护、易测试的模块,能否正确的使用函数往往也是区分初级程序员的标志。
遍历切片和键值对对象
在 golang 里遍历切片和字典使用的最为广泛,但是这里面有一些常见的坑需要避免。
正确的遍历通道
chan 对象是 golang 特有的,也支持 range 遍历,要避免 deadlock 的问题。
系统内置的同步原语
标准库 sync 包提供了诸多的并发支持,通常在满足需求的话,尽量避免直接使用 chan 来同步。
使用通道来实现同步
实际项目中,为了获得更大的灵活性,或者需要将原子性内置到模块/库里,直接使用 chan 来实现同步有时候更清晰。
动态检查对象类型
使用 golang 特有的 switch-type 范式来检测对象及其指针对象。
使用 select 检查 IO
理解 golang 的 select 语句的作用及其使用场景、执行顺序。
系统 I/O 的读写姿势
包含 io、bufio、ioutil 包的接口对象和样例,如何构造 reader、writer 接口对象,如何组合接口,以及读写文件、移动位置,正确关闭资源等。
正则表达式匹配和提取
任何项目都无法避免正则表达式的使用。
JSON 序列化和反序列化
使用 golang tag 来定制 json 的序列化、反序列化行为。
理解 context 包的作用
理解 context 包的起源和功能及其使用场景。
合理的使用泛型
Go 1.18 以后的版本提供了泛型支持,合理使用泛型提高代码的维护性。
常用的模式和技巧
Go 社区常用的代码模式和技巧,适当运用不仅能提高代码质量,还能更快的理解开源库的实现机制。
Http/Web 示例
Go 开发 http/web 服务极其简单,重点就是 http 包的使用和理解。
Database Access 示例
Go 的 database 包实现的非常精妙,具有极强的开放性,值得学习,实际开发中 sqlx/gorm 仍需掌握。
TCP/UDP Socket 示例
Go 构建 tcp/udp 程序和 http 程序一样简单,借助 goroutine/chan 很轻松的实现高吞吐量服务器。
OpenAI LLMs 应用示例
AI 实际应用已深入人心,而基于 OPENAI API 的封装库 langchaingo 又使得编写 LLMs APP 更容易。