跳转到主要内容
eLearner.app

互动课程

去课程

用英语从头开始学习 Go。使用静态验证进行练习,并直接链接到官方 Go Playground,以便在真正的编译器上运行代码。

通过关键字静态验证+官方执行Go Playground(一键复制代码+打开)。

01 · 模块 1 — 语言基础知识

5 节课

基础:包、变量、类型、常量、运算符以及 fmt 包的输入/输出。

  1. 1.1变量和类型var、短声明 `:=`、基本类型(int、float64、string、bool)以及静态类型的概念。~10 min
  2. 1.2零值和类型转换每个变量都有一个默认值;转换是显式的(“int(x)”、“string(b)”)。~10 min
  3. 1.3常数和 iota`const`、无类型常量和用于生成可读枚举的 `iota` 模式。~10 min
  4. 1.4运营商算术、比较、逻辑和按位;优先级以及与其他语言的差异。~8 min
  5. 1.5带 fmt 的输入/输出`fmt.Println`、`fmt.Printf`、格式动词(`%d`、`%s`、`%v`、`%T`)以及何时首选其中之一。~10 min

02 · 模块 2 — 控制流程

5 节课

决策和重复:if 与 init 语句、单个“for”、惯用的 switch 和显式错误处理。

  1. 2.1if、else 和 init 语句`if v := f(); v > 0 { ... }` 形式以及为什么 Go 没有三元运算符。~10 min
  2. 2.2for:唯一的循环for 的三种形式:三子句、单条件(= while)和无限;使用“中断”和“继续”。~10 min
  3. 2.3对于...范围迭代切片、映射和字符串;返回值是一个副本,当忽略带有“_”的索引或值时。~10 min
  4. 2.4惯用开关没有隐式的失败,案例中的复杂表达式,没有条件的切换作为 if 链。~10 min
  5. 2.5错误:“if err != nil”模式错误就是价值观;基本模式 `if err != nil { return err }` 以及为什么 Go 没有例外。~12 min

03 · 第 3 单元 — 功能

5 节课

作为一等公民的功能:签名、多重返回、可变参数、闭包和“defer”。

  1. 3.1签名及参数`func name(p type) type` 语法,默认传值,相同类型的参数分组在一起。~10 min
  2. 3.2多重返回和命名返回返回多个值(`value, err`)、命名返回模式以及何时不使用它。~12 min
  3. 3.3可变参数函数`func sum(nums ...int) int`,用 `slice...` 扩展切片,来自 stdlib 的示例。~10 min
  4. 3.4闭包和函数作为值从周围上下文捕获变量的匿名函数;适配器和工厂模式。~12 min
  5. 3.5`defer`:保证清理推迟执行直到返回; `defer f.Close()` 模式、LIFO 顺序、循环内的陷阱。~12 min

04 · 模块 4 — 集合

5 节课

数组、切片(最重要的结构)、映射、字符串内的符文以及排序。

  1. 4.1定长数组`[N]T`语法,为什么Go中很少使用真正的数组,从数组到切片的转换。~8 min
  2. 4.2切片:惯用结构`make`、`append`、len/cap、切片 `s[a:b]`、共享底层数组以及何时复制。~15 min
  3. 4.3映射:键和值声明、逗号 ok 访问 (`v, ok := m[k]`)、`删除`、非确定性迭代。~12 min
  4. 4.4字符串、字节和符文字符串是UTF-8字节; `range` 产生符文; `len()` 计算的是字节数,而不是字符数。~12 min
  5. 4.5使用 sort 包进行排序`sort.Ints`、`sort.Strings`、`sort.Slice` 具有比较功能,稳定。~10 min

05 · 模块 5 — 结构和方法

5 节课

复合数据类型:结构、值或指针接收器上的方法、组合(无继承)和标签。

  1. 5.1定义和使用结构体`type Person struct { 名称字符串; Age int }`、位置初始化与命名初始化、匿名结构。~12 min
  2. 5.2方法:值与指针接收器`func (p Person) Hello()` 与 `func (p *Person) Rename(n string)`;何时使用其中之一。~14 min
  3. 5.3组合(嵌入)Go 没有继承:您可以通过将一种类型嵌入另一种类型来进行组合。方法推广。~12 min
  4. 5.4字段标签和 JSON`json:"name,omitempty"`,使用 `encoding/json` 进行编组/解组,常见错误。~12 min
  5. 5.5“New...”构造函数模式Go 没有构造函数:约定是验证并返回错误的 `NewT(...) *T` 函数。~10 min

06 · 模块 6 — 接口

5 节课

结构接口(无显式实现)、断言、类型开关以及标准“Stringer”和“error”接口。

  1. 6.1接口:定义行为接口是一组方法;无论谁实现它们,都会自动满足它(静态鸭子类型)。~12 min
  2. 6.2类型断言`v, ok := i.(*MyT)`,逗号 ok 形式,以避免恐慌,何时更喜欢断言而不是类型开关。~10 min
  3. 6.3类型开关`switch v := x.(type) { case int: ... }` 来调度运行时类型。~10 min
  4. 6.4斯金格接口实现“String() string”会改变“fmt.Println”表示类型的方式。~10 min
  5. 6.5错误接口`error` 只是 `Error() string`;创建自定义错误,`errors.Is`、`errors.As`、`fmt.Errorf("%w", err)`。~14 min

07 · 模块 7 — 并发

5 节课

Go 的并发模型:轻量级 goroutine、通信通道、“select”、同步和上下文。

  1. 7.1Goroutine:轻量级并行`go f()`,一个goroutine的成本,为什么main不等待就退出,以及如何同步。~12 min
  2. 7.2渠道:类型化沟通`ch := make(chan int)`、`ch <- v`、`v := <-ch`,缓冲通道与非缓冲通道,关闭。~15 min
  3. 7.3`select`:多路复用通道等待第一个就绪通道,“default”情况以避免阻塞,超时模式为“time.After”。~12 min
  4. 7.4`sync.Mutex` 和 `sync.WaitGroup`当通道不够时:使用 Mutex 保护共享状态,使用 WaitGroup 等待 N 个 goroutine。~14 min
  5. 7.5`context.Context`:取消和截止日期在 goroutine 之间传播取消,`context.WithTimeout`、`ctx.Done()`、第一个参数模式。~14 min

08 · 模块 8 — 基本标准库

5 节课

您每天都会使用的软件包:fmt、strings、strconv、io、os、time、encoding/json。

  1. 8.1高级“fmt”`Sprintf`、`Fprintf`、`%+v` 和 `%#v` 动词、宽度和精度格式、`-` 和 `0` 标志。~10 min
  2. 8.2`strings` 和 `strconv``strings.Contains/Split/Join/TrimSpace`、`strconv.Itoa/Atoi/ParseInt/FormatFloat`。~12 min
  3. 8.3`io` 和 `os`:文件和流`os.Open/Create/ReadFile/WriteFile`、`io.Reader/Writer` 接口、`defer f.Close()` 模式。~14 min
  4. 8.4“时间”包`time.Now()`、持续时间、使用参考布局 `2006-01-02 15:04:05` 进行解析、计时器和股票行情。~12 min
  5. 8.5`编码/json``json.Marshal/Unmarshal`、结构标签、流的 `json.Decoder/Encoder`、解析错误。~14 min

09 · 模块 9 — 测试、模块和工具

5 节课

“go test”工具、表驱动测试、基准测试、使用“go mod”进行依赖管理以及构建标签。

  1. 9.1“测试”包`*_test.go` 文件、`TestXxx(t *testing.T)` 函数、`t.Error` 与 `t.Fatal`、`go test ./...`。~12 min
  2. 9.2表驱动测试惯用模式:带有输入和预期输出的匿名结构切片,“t.Run(name, ...)”用于子测试。~14 min
  3. 9.3基准和配置文件`BenchmarkXxx(b *testing.B)` 函数,`for i := 0; i < b.N; i++` 循环,`go test -bench=.`。~12 min
  4. 9.4Go 模块`go mod init`、`go get`、语义导入版本控制、`go.sum` 锁定文件、`go mod tidy`。~12 min
  5. 9.5构建约束和标签用于跨平台构建的“//go:build ...”指令,分离测试/集成代码,真实世界的示例。~10 min

10 · 模块 10 — 惯用语练习

5 节课

命名、高级错误处理、泛型(Go 1.18+)和两个迷你项目:一个 CLI 和一个 HTTP 服务器。

  1. 10.1命名约定和风格PascalCase 用于导出,camelCase 用于本地,短范围内的短名称,“gofmt”是不可协商的。~10 min
  2. 10.2惯用的错误处理哨兵错误 (`io.EOF`)、使用 `Unwrap` 的自定义错误、使用 `%w` 包装、何时使用 `panic`。~14 min
  3. 10.3泛型(Go 1.18+)类型参数 `func Map[T, U any](s []T, f func(T) U) []U`,约束(`comparable`,自定义),权衡。~15 min
  4. 10.4迷你项目:带有标志的 CLI“flag”包、命令和子命令、退出代码、输出的“log”与“fmt”。~18 min
  5. 10.5迷你项目:HTTP 服务器`net/http`,最小的处理程序和路由器,作为装饰器的中间件,带有上下文的优雅关闭。~18 min