jack 09c91f9f4b update před 4 měsíci
..
01-env_hello_world 72722ad246 update před 4 měsíci
02-package_import 72722ad246 update před 4 měsíci
03-visibility_rules 72722ad246 update před 4 měsíci
04-variables_var 72722ad246 update před 4 měsíci
05-short_declaration 72722ad246 update před 4 měsíci
06-constants_iota 72722ad246 update před 4 měsíci
07-basic_data_types 72722ad246 update před 4 měsíci
08-string_operations 72722ad246 update před 4 měsíci
09-string_formatting 09c91f9f4b update před 4 měsíci
10-arrays 09c91f9f4b update před 4 měsíci
11-slices 09c91f9f4b update před 4 měsíci
12-slice_internals 09c91f9f4b update před 4 měsíci
13-maps 09c91f9f4b update před 4 měsíci
14-structs 09c91f9f4b update před 4 měsíci
15-pointers 09c91f9f4b update před 4 měsíci
Readme.md 72722ad246 update před 4 měsíci

Readme.md

01.环境 & Hello World 文件名: env_hello_world 概念:安装、GOPATH vs Go Modules、go run / build 代码:package main; import "fmt"; func main(){ fmt.Println("hi") } 练习:把 "hi" 换成自己名字并编译成二进制。

02.包声明与导入 文件名: package_import 概念:package 声明规则、import 语法、别名、点导入、空白导入 代码:package main; import ("fmt"; "math/rand"); func main(){ fmt.Println(rand.Int()) } 练习:go mod init myproject 新建一个 quote 包,导出一个函数打印一句名言。

03.可见性规则 文件名: visibility_rules 概念:首字母大写导出,小写私有;包内外访问差异 代码:package utils; var Public = 1; var private = 2 练习:在 main 包尝试访问 utils.Public 和 utils.private,观察编译错误。

04.变量声明(var) 文件名: variables_var 概念:var 声明、零值、多变量同时声明 代码:var i int; var s = "hello"; var x, y, z float64 练习:打印各类型零值并观察结果。

05.短变量声明(:=) 文件名: short_declaration 概念:函数体内自动推断类型、重声明限制 代码:name := "gopher"; age := 10 练习:将第 4 步代码全部改写成短声明形式。

06.常量与 iota 文件名: constants_iota 概念:const 声明、iota 自增、枚举 代码:const ( Sunday = iota; Monday; Tuesday ) 练习:用 iota 定义一周七天的枚举并打印。

07.基本数据类型 文件名: basic_data_types 概念:bool, string, 整数/浮点/复数, byte, rune 代码:var b bool; var f float64 = 3.14; var c complex128 = 1 + 2i 练习:打印复数的实部与虚部。

08.字符串操作 文件名: string_operations 概念:拼接、len、for range、[]rune 转换 代码:s := "hello"; fmt.Println(len(s), []rune(s)) 练习:把 "hello" 逆序输出。

09.字符串格式化 文件名: string_formatting 概念:Printf 动词、%v %T %q %x %.2f 代码:fmt.Printf("type=%T, value=%q, hex=%x\n", 255, 255, 255) 练习:用 %q 打印含转义字符的字符串。

10.数组 文件名: arrays 概念:固定长度、值类型、字面量初始化 代码:var a [3]int = [3]int{1, 2, 3} 练习:写一个函数返回数组元素之和。

11.切片 文件名: slices 概念:动态长度、append、copy、切片表达式 代码:s := []int{1, 2, 3}; s = append(s, 4) 练习:实现 remove(slice, index) 删除指定元素。

12.切片底层原理 文件名: slice_internals 概念:len vs cap、共享底层数组、扩容策略 代码:fmt.Println(len(s), cap(s)) 练习:通过打印验证 append 触发扩容时的容量变化。

13.映射 文件名: maps 概念:hash 表、增删改查、ok 判断 代码:m := map[string]int{"a": 1}; v, ok := m["b"] 练习:统计一段文本中每个单词出现次数。

14.结构体 文件名: structs 概念:定义、字面量、字段公开/私有、嵌套 代码:type Point struct{ X, Y float64 } 练习:给 Point 添加 Distance 方法计算两点距离。

15.指针 文件名: pointers 概念:& 取址、* 解引用、值 vs 指针接收者 代码:p := &x; *p = 100 练习:实现 swap(a, b *int) 交换两整数。

16.函数(基础) 文件名: basic_functions 概念:参数、返回值、多返回值、命名返回值 代码:func add(a, b int) (sum int) { sum = a + b; return } 练习:写函数返回两个数的和与差。

17.可变参数 文件名: variadic_params 概念:...T、在函数内当作切片使用 代码:func sum(nums ...int) int { ... } 练习:实现 max(nums ...int) int 取最大值。

18.defer 语句 文件名: defer_statement 概念:LIFO 延迟执行、常用于资源清理 代码:defer fmt.Println(1); defer fmt.Println(2) 练习:观察并解释输出顺序。

19.init 函数 文件名: init_function 概念:每个源文件可有多个 init、执行顺序 代码:func init() { fmt.Println("init") } 练习:在多个文件写 init 并观察打印顺序。

20.error 接口 文件名: error_handling 概念:error 类型、errors.New、fmt.Errorf 代码:err := errors.New("something wrong") 练习:写 div(a, b float64) (float64, error) 处理除零。

21.if 语句 文件名: if_statement 概念:初始化语句、作用域 代码:if x := 10; x > 5 { ... } 练习:写闰年判断函数。

22.switch 语句 文件名: switch_statement 概念:无表达式 switch、fallthrough、多 case 代码:switch day { case 1: ... } 练习:把数字 1-7 转成英文星期单词。

23.for 循环 文件名: for_loops 概念:三段式、条件式、无限循环、break/continue 代码:for i := 0; i < 10; i++ { ... } 练习:打印 1-100 的偶数。

24.range 文件名: range_loop 概念:遍历 slice、map、string 代码:for i, v := range []int{1, 2, 3} { ... } 练习:用 range 统计字符串中每个字符出现次数。

25.goto 与标签 文件名: goto_labels 概念:跳转标签、跳出多层循环 代码:goto END 练习:用 goto 实现重试三次的逻辑。

26.方法 文件名: methods 概念:值/指针接收者、方法集 代码:func (p Point) Move(dx, dy float64) { ... } 练习:给 Celsius 类型添加 String() 方法实现自定义打印。

27.接口 文件名: interfaces 概念:接口定义、隐式实现、空接口 代码:type Shape interface { Area() float64 } 练习:让 Rect 和 Circle 实现 Shape 接口。

28.类型断言 文件名: type_assertions 概念:v, ok := i.(T) 代码:if s, ok := val.(string); ok { ... } 练习:从 []interface{} 中提取所有 int 并求和。

29.类型 switch 文件名: type_switches 概念:switch v := i.(type) 代码:switch v := val.(type) { case int: ... } 练习:打印任意值的实际类型。

30.组合(嵌入) 文件名: embedding 概念:结构体嵌入接口/结构体实现类似继承 代码:type Logger struct{ log.Logger } 练习:嵌入 fmt.Stringer 并调用方法。

31.goroutine 文件名: goroutines 概念:轻量级线程、go 关键字启动 代码:go fmt.Println("hello from goroutine") 练习:并发打印 A-Z 和 0-9 交叉输出。

32.channel 基础 文件名: channels_basics 概念:chan T、发送/接收操作、阻塞特性 代码:ch := make(chan int); ch <- 1; v := <-ch 练习:启动两个 goroutine 交替打印 1-10。

33.缓冲 channel & close 文件名: buffered_channels_close 概念:带缓冲 channel、close、range 接收 代码:ch := make(chan int, 2); close(ch) 练习:实现 fan-out 多 worker 模式。

34.select 语句 文件名: select_statement 概念:多路复用、default 非阻塞、超时控制 代码:select { case v := <-ch: ... default: ... } 练习:用 time.After 实现 1 秒超时。

35.sync.Mutex 文件名: sync_mutex 概念:互斥锁、临界区保护 代码:var mu sync.Mutex; mu.Lock(); ...; mu.Unlock() 练习:并发累加 1000 次并保证正确性。

36.sync.WaitGroup 文件名: sync_waitgroup 概念:等待一组 goroutine 完成 代码:var wg sync.WaitGroup; wg.Add(1); go func(){ defer wg.Done() }(); wg.Wait() 练习:等待 N 个任务完成再退出 main。

37.单元测试 文件名: unit_tests 概念:*_test.go、TestXxx(t *testing.T) 代码:func TestAdd(t *testing.T) { ... } 练习:为 add 函数写 3 个测试用例。

38.表驱动测试 文件名: table_driven_tests 概念:用切片/结构体组织多组输入输出 代码:tests := []struct{ a, b, want int }{...} 练习:把上一步测试改为表驱动风格。

39.基准测试 文件名: benchmarks 概念:BenchmarkXxx(b *testing.B)、go test -bench 代码:func BenchmarkAdd(b *testing.B) { ... } 练习:基准测试 sum(nums ...int) 性能。

40.模块管理(go mod) 文件名: go_modules 概念:go mod init、tidy、get、语义化版本 代码:go mod init hello; go get github.com/google/uuid@v1.2.0 练习:用 uuid 包生成并打印一个 UUID。