jack 4 miesięcy temu
rodzic
commit
ea166eb170
33 zmienionych plików z 398 dodań i 27 usunięć
  1. 33 0
      gf/00-hello/go.mod
  2. 74 0
      gf/00-hello/go.sum
  3. 15 0
      gf/00-hello/main.go
  4. 3 0
      golang-learn/01-env_hello_world/go.mod
  5. 7 0
      golang-learn/01-env_hello_world/main.go
  6. 239 0
      golang-learn/Readme.md
  7. 1 1
      rabbitmq/01-路由模式(Routing)/consumer_routing.py
  8. 1 1
      rabbitmq/01-路由模式(Routing)/producer_routing.py
  9. 1 1
      rabbitmq/02-主题模式(Topic)/consumer_topic.py
  10. 1 1
      rabbitmq/02-主题模式(Topic)/producer_topic.py
  11. 1 1
      rabbitmq/03-头部模式(Header)/consumer_headers.py
  12. 1 1
      rabbitmq/03-头部模式(Header)/producer_headers.py
  13. 1 1
      rabbitmq/04-任务队列(Work Queue)/consumer.py
  14. 1 1
      rabbitmq/04-任务队列(Work Queue)/consumer_auto_ack.py
  15. 1 1
      rabbitmq/04-任务队列(Work Queue)/producer.py
  16. 1 1
      rabbitmq/04-任务队列(Work Queue)/producer_durable.py
  17. 1 1
      rabbitmq/05-RPC模式/rpc_client.py
  18. 1 1
      rabbitmq/05-RPC模式/rpc_server.py
  19. 1 1
      rabbitmq/06-发布订阅模式(fanout)/consumer_pubsub.py
  20. 1 1
      rabbitmq/06-发布订阅模式(fanout)/producer_pubsub.py
  21. 1 1
      rabbitmq/07-延迟队列(Delayed Message)/consumer_delay.py
  22. 1 1
      rabbitmq/07-延迟队列(Delayed Message)/producer_delay.py
  23. 1 1
      rabbitmq/08-优先级队列(Priority Queue)/batch_priority.py
  24. 1 1
      rabbitmq/08-优先级队列(Priority Queue)/consumer_priority.py
  25. 1 1
      rabbitmq/08-优先级队列(Priority Queue)/producer_priority.py
  26. 1 1
      rabbitmq/09-死信队列(DLX|DLQ)/consumer_dlq.py
  27. 1 1
      rabbitmq/09-死信队列(DLX|DLQ)/producer_dlq.py
  28. 1 1
      rabbitmq/10-惰性队列(Lazy Queue)/consumer_lazy.py
  29. 1 1
      rabbitmq/10-惰性队列(Lazy Queue)/producer_lazy.py
  30. 1 1
      rabbitmq/11-仲裁队列(Quorum Queue)/consumer_quorum.py
  31. 1 1
      rabbitmq/11-仲裁队列(Quorum Queue)/producer_quorum.py
  32. 1 1
      rabbitmq/12-流式日志(Stream)/stream_consumer.py
  33. 1 1
      rabbitmq/12-流式日志(Stream)/stream_producer.py

+ 33 - 0
gf/00-hello/go.mod

@@ -0,0 +1,33 @@
+module main
+
+go 1.22.2
+
+require github.com/gogf/gf/v2 v2.9.0
+
+require (
+	github.com/BurntSushi/toml v1.4.0 // indirect
+	github.com/clbanning/mxj/v2 v2.7.0 // indirect
+	github.com/emirpasic/gods v1.18.1 // indirect
+	github.com/fatih/color v1.18.0 // indirect
+	github.com/fsnotify/fsnotify v1.7.0 // indirect
+	github.com/go-logr/logr v1.4.2 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/google/uuid v1.6.0 // indirect
+	github.com/gorilla/websocket v1.5.3 // indirect
+	github.com/grokify/html-strip-tags-go v0.1.0 // indirect
+	github.com/kr/text v0.2.0 // indirect
+	github.com/magiconair/properties v1.8.9 // indirect
+	github.com/mattn/go-colorable v0.1.13 // indirect
+	github.com/mattn/go-isatty v0.0.20 // indirect
+	github.com/mattn/go-runewidth v0.0.16 // indirect
+	github.com/olekukonko/tablewriter v0.0.5 // indirect
+	github.com/rivo/uniseg v0.4.7 // indirect
+	go.opentelemetry.io/otel v1.32.0 // indirect
+	go.opentelemetry.io/otel/metric v1.32.0 // indirect
+	go.opentelemetry.io/otel/sdk v1.32.0 // indirect
+	go.opentelemetry.io/otel/trace v1.32.0 // indirect
+	golang.org/x/net v0.32.0 // indirect
+	golang.org/x/sys v0.28.0 // indirect
+	golang.org/x/text v0.21.0 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+)

+ 74 - 0
gf/00-hello/go.sum

@@ -0,0 +1,74 @@
+github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
+github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
+github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME=
+github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
+github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
+github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
+github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
+github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
+github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
+github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/gogf/gf/v2 v2.9.0 h1:semN5Q5qGjDQEv4620VzxcJzJlSD07gmyJ9Sy9zfbHk=
+github.com/gogf/gf/v2 v2.9.0/go.mod h1:sWGQw+pLILtuHmbOxoe0D+0DdaXxbleT57axOLH2vKI=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
+github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4=
+github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM=
+github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
+github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
+github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
+github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
+github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
+github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
+github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
+github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
+github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
+github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
+github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
+github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
+github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
+github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U=
+go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg=
+go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M=
+go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8=
+go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4=
+go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU=
+go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM=
+go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8=
+golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI=
+golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs=
+golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
+golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

+ 15 - 0
gf/00-hello/main.go

@@ -0,0 +1,15 @@
+package main
+
+import (
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/net/ghttp"
+)
+
+func main() {
+	s := g.Server()
+	s.BindHandler("/", func(r *ghttp.Request) {
+		r.Response.Write("Hello World!")
+	})
+	s.SetPort(8888)
+	s.Run()
+}

+ 3 - 0
golang-learn/01-env_hello_world/go.mod

@@ -0,0 +1,3 @@
+module env_hello_world
+
+go 1.22.2

+ 7 - 0
golang-learn/01-env_hello_world/main.go

@@ -0,0 +1,7 @@
+package main
+
+import "fmt"
+
+func main() {
+	fmt.Println("Hello, World!")
+}

+ 239 - 0
golang-learn/Readme.md

@@ -0,0 +1,239 @@
+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()) }
+练习:新建一个 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。

+ 1 - 1
rabbitmq/01-路由模式(Routing)/consumer_routing.py

@@ -3,7 +3,7 @@ import pika
 import sys
 
 # 连接参数
-user_info = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+user_info = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 connection = pika.BlockingConnection(
     pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local',
                               5672,

+ 1 - 1
rabbitmq/01-路由模式(Routing)/producer_routing.py

@@ -3,7 +3,7 @@ import pika
 import sys
 
 # 连接参数
-user_info = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+user_info = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 connection = pika.BlockingConnection(pika.ConnectionParameters(
     'rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', user_info))
 channel = connection.channel()

+ 1 - 1
rabbitmq/02-主题模式(Topic)/consumer_topic.py

@@ -2,7 +2,7 @@
 import pika
 import sys
 
-user_info = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+user_info = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 connection = pika.BlockingConnection(
     pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', user_info)
 )

+ 1 - 1
rabbitmq/02-主题模式(Topic)/producer_topic.py

@@ -2,7 +2,7 @@
 import pika
 import sys
 
-user_info = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+user_info = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 connection = pika.BlockingConnection(
     pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', user_info)
 )

+ 1 - 1
rabbitmq/03-头部模式(Header)/consumer_headers.py

@@ -2,7 +2,7 @@
 import pika
 import sys
 
-user_info = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+user_info = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 connection = pika.BlockingConnection(
     pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', user_info)
 )

+ 1 - 1
rabbitmq/03-头部模式(Header)/producer_headers.py

@@ -3,7 +3,7 @@ import pika
 import sys
 import json
 
-user_info = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+user_info = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 connection = pika.BlockingConnection(
     pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', user_info)
 )

+ 1 - 1
rabbitmq/04-任务队列(Work Queue)/consumer.py

@@ -3,7 +3,7 @@
 
 import pika
 
-user_info = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+user_info = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 connection = pika.BlockingConnection(pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', user_info))
 channel = connection.channel()
 

+ 1 - 1
rabbitmq/04-任务队列(Work Queue)/consumer_auto_ack.py

@@ -8,7 +8,7 @@
 import pika
 import time
 
-user_info = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+user_info = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 connection = pika.BlockingConnection(pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', user_info))
 channel = connection.channel()
 

+ 1 - 1
rabbitmq/04-任务队列(Work Queue)/producer.py

@@ -4,7 +4,7 @@
 import pika
 import time
 
-user_info = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+user_info = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 connection = pika.BlockingConnection(pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', user_info))#连接服务器上的RabbitMQ服务
 
 # 创建一个channel

+ 1 - 1
rabbitmq/04-任务队列(Work Queue)/producer_durable.py

@@ -4,7 +4,7 @@
 import pika
 import time
 
-user_info = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+user_info = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 connection = pika.BlockingConnection(pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', user_info))#连接服务器上的RabbitMQ服务
 
 # 创建一个channel

+ 1 - 1
rabbitmq/05-RPC模式/rpc_client.py

@@ -4,7 +4,7 @@ import json
 
 class RpcClient:
     def __init__(self):
-        user_info = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+        user_info = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
         self.connection = pika.BlockingConnection(
             pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', user_info)
         )

+ 1 - 1
rabbitmq/05-RPC模式/rpc_server.py

@@ -2,7 +2,7 @@ import pika
 import json
 
 # 连接信息
-user_info = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+user_info = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 connection = pika.BlockingConnection(
     pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', user_info)
 )

+ 1 - 1
rabbitmq/06-发布订阅模式(fanout)/consumer_pubsub.py

@@ -1,7 +1,7 @@
 #消费者
 import pika
 
-user_info = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+user_info = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 connection = pika.BlockingConnection(pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', user_info))
 channel = connection.channel()
 

+ 1 - 1
rabbitmq/06-发布订阅模式(fanout)/producer_pubsub.py

@@ -1,7 +1,7 @@
 #生产者
 import pika
 
-user_info = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+user_info = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 connection = pika.BlockingConnection(pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', user_info))
 channel = connection.channel()
 

+ 1 - 1
rabbitmq/07-延迟队列(Delayed Message)/consumer_delay.py

@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 import pika
 
-user_info = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+user_info = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 connection = pika.BlockingConnection(
     pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', user_info)
 )

+ 1 - 1
rabbitmq/07-延迟队列(Delayed Message)/producer_delay.py

@@ -2,7 +2,7 @@
 import pika
 import sys
 
-user_info = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+user_info = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 connection = pika.BlockingConnection(
     pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', user_info)
 )

+ 1 - 1
rabbitmq/08-优先级队列(Priority Queue)/batch_priority.py

@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 import pika
 
-user_info = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+user_info = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 conn = pika.BlockingConnection(
     pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', user_info)
 )

+ 1 - 1
rabbitmq/08-优先级队列(Priority Queue)/consumer_priority.py

@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 import pika
 
-user_info = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+user_info = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 connection = pika.BlockingConnection(
     pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', user_info)
 )

+ 1 - 1
rabbitmq/08-优先级队列(Priority Queue)/producer_priority.py

@@ -2,7 +2,7 @@
 import pika
 import sys
 
-user_info = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+user_info = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 connection = pika.BlockingConnection(
     pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', user_info)
 )

+ 1 - 1
rabbitmq/09-死信队列(DLX|DLQ)/consumer_dlq.py

@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 import pika
 
-USER = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+USER = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 PARAMS = pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', USER)
 
 conn = pika.BlockingConnection(PARAMS)

+ 1 - 1
rabbitmq/09-死信队列(DLX|DLQ)/producer_dlq.py

@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 import pika
 
-USER = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+USER = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 PARAMS = pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', USER)
 
 conn = pika.BlockingConnection(PARAMS)

+ 1 - 1
rabbitmq/10-惰性队列(Lazy Queue)/consumer_lazy.py

@@ -2,7 +2,7 @@
 import pika
 import time
 
-user_info = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+user_info = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 params = pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', user_info)
 conn = pika.BlockingConnection(params)
 ch = conn.channel()

+ 1 - 1
rabbitmq/10-惰性队列(Lazy Queue)/producer_lazy.py

@@ -2,7 +2,7 @@
 import pika
 import sys
 
-user_info = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+user_info = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 params = pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', user_info)
 conn = pika.BlockingConnection(params)
 ch = conn.channel()

+ 1 - 1
rabbitmq/11-仲裁队列(Quorum Queue)/consumer_quorum.py

@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 import pika
 
-user_info = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+user_info = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 params = pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', user_info)
 conn = pika.BlockingConnection(params)
 ch = conn.channel()

+ 1 - 1
rabbitmq/11-仲裁队列(Quorum Queue)/producer_quorum.py

@@ -2,7 +2,7 @@
 import pika
 import sys
 
-user_info = pika.PlainCredentials('user', 'Un2yzriWm7veSDoh')
+user_info = pika.PlainCredentials('user', 'J70e6K7BRrxrU1dO')
 params = pika.ConnectionParameters('rabbitmq.rabbitmq.svc.cluster.local', 5672, '/', user_info)
 conn = pika.BlockingConnection(params)
 ch = conn.channel()

+ 1 - 1
rabbitmq/12-流式日志(Stream)/stream_consumer.py

@@ -4,7 +4,7 @@ from rstream import Consumer, OffsetType
 
 STREAM = 'demo-stream'
 USER   = 'user'
-PWD    = 'Un2yzriWm7veSDoh'
+PWD    = 'J70e6K7BRrxrU1dO'
 HOST   = 'rabbitmq.rabbitmq.svc.cluster.local'
 
 async def on_message(msg):

+ 1 - 1
rabbitmq/12-流式日志(Stream)/stream_producer.py

@@ -4,7 +4,7 @@ from rstream import Producer
 
 STREAM = 'demo-stream'
 USER   = 'user'
-PWD    = 'Un2yzriWm7veSDoh'
+PWD    = 'J70e6K7BRrxrU1dO'
 HOST   = 'rabbitmq.rabbitmq.svc.cluster.local'
 
 async def main():