📝 Go 语言后端开发学习笔记 (第一阶段)
1. 核心基础概念
变量声明与类型推断
-
var关键字:用于声明变量,Go 会自动进行零值初始化(如int为0,string为"")。 -
:=(短变量声明) :- 用法:
id := 1等同于var id int = 1。 - 限制:只能在函数内部使用。
- 特点:自动类型推断,代码简洁。
- 用法:
结构体 (Struct)
- Go 不使用“类 (Class)”,而是使用结构体来组合数据。
- JSON 标签:
json:"id"告诉 Go 如何在 JSON 字符串和结构体字段之间进行映射。 - 可见性:字段名首字母大写表示公开(Public),可被 JSON 包等外部代码访问。
2. 并发安全:互斥锁 (Mutex)
这是开发中处理最精细的部分。
-
原理:在多线程(Goroutine)环境下,防止多个请求同时修改同一个切片导致数据崩溃。
-
模式:
globalTodos.Lock() // 🔐 加锁 defer globalTodos.Unlock() // 🔓 延迟解锁(确保函数结束时一定释放)
3. Web API 核心模式
HTTP Handler 签名
func handler(w http.ResponseWriter, r *http.Request)
w(ResponseWriter):你的“信封”,用来写回响应。r(*Request):你的“包裹”,包含客户端发来的方法(Method)、路径(Path)和数据(Body)。
JSON 处理 (瑞士军刀)
- 解码 (Decode) :
json.NewDecoder(r.Body).Decode(&target)—— 把收到的 JSON 转成 Go 结构体。 - 编码 (Encode) :
json.NewEncoder(w).Encode(data)—— 把 Go 数据发回给客户端。
4. 重点困惑复盘 (FAQ)
| 困惑点 | 深度解析 |
|---|---|
var newTodo Todo 为什么能直接用点操作符? | 在 Go 中,var 声明后会直接分配内存并初始化。结构体变量不是“引用”,它本身就是包含了所有字段的实体值,所以可以直接访问其成员。 |
为什么 range 循环里修改 t 无效? | for i, t := range list 中的 t 是原数据的一个拷贝(副本)。修改副本不影响原件,因此必须通过索引 list[i] 来修改原切片。 |
defer 的执行时机? | defer 语句会把任务压入栈中,直到包含它的函数执行到 return 或末尾时,才倒序执行。它是处理资源关闭和解锁的神器。 |
路由路径末尾的 / 有什么区别? | "/todos" 是精确匹配;"/todos/" 是前缀匹配。只有带了后缀斜杠,才能匹配 /todos/1 这种带 ID 的子路径。 |
5. 切片删除的“黑科技”
由于 Go 没有内置删除函数,我们使用的是切片重组:
list = append(list[:i], list[i+1:]...)
- 含义:把索引
i之前的部分和i+1之后的部分拼接。 ...的作用:将切片打散为独立的元素传入append(变参展开)。