如何使用Golang开发用户信息API_Golang接口与数据结构实战

7次阅读

go用户信息API核心在于结构组织:User字段须大写导出并配json标签,如ID int json:”id”;路由用gorilla/mux正则提取参数并校验;查无结果需用Errors.Is(err, sql.ErrNoRows)判404而非500。

如何使用Golang开发用户信息API_Golang接口与数据结构实战

Go 语言写用户信息 API,核心不是“能不能”,而是「结构怎么组织才不踩坑」——比如 User 结构体字段要不要导出、json 标签漏写导致返回空对象、用 database/sql 查不到数据却没报错、http 路由参数解析失败静默忽略。

定义 User 结构体时,字段首字母大小写和 json 标签缺一不可

Go 的 JSON 序列化只处理导出字段(首字母大写),且默认 key 是字段名全小写。常见错误是写成小写字段或漏标 json 导致前端收不到数据:

  • type User Struct { ID int; Name String }前端收到 {"id":0,"name":""}(小写 key,但值为零值)
  • type User struct { id int `json:"id"` }id 不导出,序列化后该字段消失
  • 正确写法:type User struct { ID int `json:"id"` Name string `json:"name"` }
  • 额外建议:加 omitempty 避免返回空字符串或零值字段,如 Name string `json:"name,omitempty"`

http.ServeMuxgorilla/mux 处理 /users/{id} 路由时,别依赖 URL 拆分

手动 strings.Split(r.URL.Path, "/") 解析路径极易出错(比如多斜杠、编码字符)。标准做法是用路由库提取参数:

  • 原生 http.ServeMux 不支持路径参数,必须换库或自己解析 —— 不推荐
  • gorilla/mux 示例:r.HandleFunc("/users/{id:[0-9]+}", getUserHandler).Methods("GET"),然后在 handler 中用 mux.Vars(r)["id"] 取值
  • 注意:{id:[0-9]+} 正则能过滤非法 ID,避免后续转 int 时 panic
  • 别忘了对 vars["id"]strconv.Atoi 并检查 error,否则 400 请求可能返回 500

数据库查询返回 sql.ErrNoRows 时,不能当成普通 error 忽略

查单条用户(如 select * FROM users WHERE id = ?)最常遇到这个错误,但它不是异常,而是「查无此记录」的正常信号:

立即学习go语言免费学习笔记(深入)”;

  • 直接 if err != nil { return err } 会导致 404 被当成 500 返回
  • 正确判断:if errors.Is(err, sql.ErrNoRows) { http.Error(w, "user not found", http.StatusNotFound); return }
  • Scan 接收单行结果时,务必传指针err := row.Scan(&u.ID, &u.Name),传值会 panic
  • 如果用 QueryRow,记得调用 Scan;只调 Err() 不扫描,字段不会赋值

真正难的不是写完接口,而是每个环节都得主动防御:结构体标签写错一行,前端就收不到数据;路由没校验 ID 格式,恶意请求可能拖垮数据库;sql.ErrNoRows 当普通 error 处理,404 就变成了 500。这些点不写测试很难暴露。

text=ZqhQzanResources