基础教程

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 更容易。

Last Updated:
Contributors: Bob Wang