新闻中心

如何使用 Golang 编写一个 JSON 接口服务器_Golang RESTful API 实战演练

2025-11-16
浏览次数:
返回列表
答案:使用Golang标准库构建RESTful API,实现用户管理的增删改查功能。通过net/http处理路由与请求,encoding/json解析数据,sync.Mutex保障并发安全,以map模拟存储,创建、读取、更新和删除用户,并用curl测试接口,展示轻量高效的JSON服务实现过程。

如何使用 golang 编写一个 json 接口服务器_golang restful api 实战演练

构建一个 JSON 接口服务器是 Golang 的常见应用场景。它轻量、高效,非常适合编写 RESTful API。下面通过一个简单的实战示例,带你一步步实现一个支持增删改查(CRUD)的用户管理接口。

初始化项目结构

创建项目目录并初始化模块:

mkdir go-rest-api
cd go-rest-api
go mod init go-rest-api

我们不依赖第三方框架,仅使用标准库 net/http 和 encoding/json,保持简洁。

定义数据模型和存储

创建一个 User 结构体,并使用 map 模拟内存存储:

type User struct {
  ID    int    json:"id"
  Name  string json:"name"
  Email string json:"email"
}

用 map 存储用户数据,配合互斥锁保证并发安全:

var (
  users = make(map[int]User)
  mu   = sync.Mutex{}
  nextID = 1
)

编写处理函数

每个 HTTP 请求对应一个处理函数。这些函数需满足 http.HandlerFunc 签名。

获取所有用户

小云雀 小云雀

剪映出品的AI视频和图片创作助手

小云雀 1949 查看详情 小云雀 func getUsers(w http.ResponseWriter, r *http.Request) {
  mu.Lock()
  defer mu.Unlock()
  
  var result []User
  for _, u := range users {
    result = append(result, u)
  }
  
  w.Header().Set("Content-Type", "application/json")
  json.NewEncoder(w).Encode(result)
}

创建用户

func createUser(w http.ResponseWriter, r *http.Request) {
  if r.Method != http.MethodPost {
    http.Error(w, "只允许 POST 方法", http.StatusMethodNotAllowed)
    return
  }
  
  var user User
  if err := json.NewDecoder(r.Body).Decode(&user); err != nil {
    http.Error(w, err.Error(), http.StatusBadRequest)
    return
  }
  
  mu.Lock()
  defer mu.Unlock()
  
  user.ID = nextID
  nextID++
  users[user.ID] = user
  
  w.Header().Set("Content-Type", "application/json")
  w.WriteHeader(http.StatusCreated)
  json.NewEncoder(w).Encode(user)
}

获取单个用户

func getUser(w http.ResponseWriter, r *http.Request) {
  id, _ := strconv.Atoi(r.URL.Path[len("/users/"):])
  mu.Lock()
  defer mu.Unlock()
  
  user, exists := users[id]
  if !exists {
    http.Error(w, "用户不存在", http.StatusNotFound)
    return
  }
  
  w.Header().Set("Content-Type", "application/json")
  json.NewEncoder(w).Encode(user)
}

更新和删除用户 可以类似实现,分别使用 PUT 和 DELETE 方法,解析路径中的 ID 并操作 map。

注册路由并启动服务器

在 main 函数中设置路由并监听端口:

func main() {
  http.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) {
    if r.Method == http.MethodGet {
      getUsers(w, r)
    } else if r.Method == http.MethodPost {
      createUser(w, r)
    }
  })
  
  http.HandleFunc("/users/", func(w http.ResponseWriter, r *http.Request) {
    if r.Method == http.MethodGet {
      getUser(w, r)
    }
  })
  
  fmt.Println("服务器启动在 :8080")
  log.Fatal(http.ListenAndServe(":8080", nil))
}

运行服务后,可用 curl 测试:

curl -X POST http://localhost:8080/users \
  -H "Content-Type: application/json" \
  -d '{"name": "Alice", "email": "alice@example.com"}'

基本上就这些。这个例子展示了如何用 Go 标准库快速搭建一个可用的 JSON 接口服务。虽然没有使用 Gin 或 Echo 等框架,但理解底层机制有助于写出更可控的代码。

以上就是如何使用 Golang 编写一个 JSON 接口服务器_Golang RESTful API 实战演练的详细内容,更多请关注其它相关文章!


# 如何在  # 贵州线上营销推广平台  # 营口推广网站建设企业  # SEO教程视频制作模板  # 延边州seo矩阵  # 搜狗网站优化案例  # 鞍山seo优化厂家  # 廊坊专注网站建设  # 益阳专业seo优化企业  # 西盟小说网站建设  # 摄影网站建设软件  # 第三方  # 解决问题  # 不存在  # 中文网  # 相关文章  # js  # 资源管理  # 如何使用  # 新和  # 加载  # 标准库  # restful api  # 路由  # ai  # curl  # usb  # 端口  # app  # golang  # go  # json 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Pyrogram与g4f集成:异步编程实践与常见错误解决  J*aScript中向JSON对象添加新属性的正确姿势  Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略  CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠  QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台  DLsite中文平台入口 DLsite官网内容在线查看  优化LangChain文档加载与ChromaDB集成:解决多文档处理与分块问题  Composer如何在生产环境安全地执行composer update  Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】  AO3最新官网入口公告_2025AO3镜像站实时查询方法  python3时间如何用calendar输出?  React中useState与局部变量:理解组件状态管理与渲染机制  PySpark中从现有列右侧提取可变长度字符创建新列的教程  如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】  网易大神账号申诉需要多久_网易大神账号申诉流程说明  CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题  steam官方入口大全 steam账号注册及操作指南  Win11怎么设置鼠标主按键_Win11鼠标左右键功能互换  LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置  Python多版本共存与虚拟环境管理深度指南  PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符  HTML元素状态管理:根据DIV内容动态启用/禁用按钮  React项目中导航栏Logo自适应布局:避免裁剪与布局溢出  4399网页游戏电脑版全新入口 4399电脑端在线玩指南  AO3官方可用镜像 Archive of Our Own网页版最新入口  探索高级语言到C/C++的转译路径:以Go为例及内存管理策略  c++ 获取系统当前时间 c++时间戳获取方法  双系统安装时,如何设置默认启动系统? msconfig命令了解一下!  Go RPC HTTP服务正确实现与常见陷阱解析  千牛数据看板网页版_千牛数据看板网页版访问方法  微信聊天记录怎么加密_微信聊天记录加密方法  《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!  Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组  Selenium Python中处理点击后新窗口加载冻结问题的策略与实践  随机参数递归函数的基准调用次数与时间复杂度探究  怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】  UC浏览器网页版登录入口官网 电脑版网址入口  J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析  汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口  PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】  Angular响应式表单:实现提交后表单及按钮的禁用与只读化  如何将HTML表格多行数据保存到Google Sheets  荣耀Play7TPro怎样在信息App置顶客服对话_iPhone荣耀Play7TPro信息App置顶客服对话【优先查看】  深入理解J*aScript Promise异步执行与微任务队列  C++如何生成随机数_C++ random库使用方法与范围设置  中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】  C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器  魅族20怎样在浏览器开无图省流_iPhone魅族20浏览器开无图省流【流量节省】  《马克思佩恩3》早期版本曝光 UI设计曾多次调整!  React Hooks最佳实践:动态组件状态管理的组件化方案 

搜索