Go-1

17 阅读2分钟

📝 Go 语言后端开发学习笔记 (第一阶段)

1. 核心基础概念

变量声明与类型推断

  • var 关键字:用于声明变量,Go 会自动进行零值初始化(如 int0string"")。

  • := (短变量声明)

    • 用法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(变参展开)。