答案:使用Golang标准库net/http创建RESTful API,通过结构体和切片在内存中实现用户数据的增删改查,配合sync.Mutex保证并发安全,支持GET、POST、PUT、DELETE方法,数据重启后丢失,适合学习和小型项目。

用Golang创建一个RESTful API来操作内存中的数据,可以通过标准库 net/http 实现路由和请求处理,结合结构体和切片存储数据。下面是一个完整、简洁的示例,实现对用户信息的增删改查(CRUD)。
package main
import (
"encoding/json"
"log"
"net/http"
"strconv"
"sync"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
}
var (
users = []User{}
nextID = 1
mu sync.Mutex
)
func main() {
http.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case "GET":
getUsers(w, r)
case "POST":
createUser(w, r)
default:
http.Error(w, "不支持的请求方法", http.StatusMethodNotAllowed)
}
})
http.HandleFunc("/users/", func(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
getUser(w, r)
} else if r.Method == "PUT" {
updateUser(w, r)
} else if r.Method == "DELETE" {
deleteUser(w, r)
}
})
log.Println("服务启动在 :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
获取所有用户
func getUsers(w http.ResponseWriter, r *http.Request) {
mu.Lock()
defer mu.Unlock()
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(users)
}
创建用户
func createUser(w http.ResponseWriter, r *http.Request) {
var user User
if err := json.NewDecoder(r.Body).Decode(&user); err != nil {
http.Error(w, "请求体格式错误", http.StatusBadRequest)
return
}
mu.Lock()
defer mu.Unlock()
user.ID = nextID
nextID++
users = append(users, user)
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusCreated)
json.NewEncoder(w).Encode(user)
}
根据ID获取单个用户
func getUser(w http.ResponseWriter, r *http.Request) {
id, err := strconv.Atoi(r.URL.Path[len("/users/"):])
if err != nil {
http.Error(w, "无效的用户ID", http.StatusBadRequest)
return
}
mu.Lock()
defer mu.Unlock()
for _, user := range users {
if user.ID == id {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(user)
return
}
}
http.Error(w, "用户未找到", http.StatusNotFound)
}
更新用户
func updateUser(w http.ResponseWriter, r *http.Request) {
id, err := strconv.Atoi(r.URL.Path[len("/users/"):])
if err != nil {
http.Error(w, "无效的用户ID", http.StatusBadRequest)
return
}
var updatedUser User
if err := json.NewDecoder(r.Body).Decode(&updatedUser); err != nil {
http.Error(w, "请求体格式错误", http.StatusBadRequest)
return
}
mu.Lock()
defer mu.Unlock()
for i, user := range users {
if user.ID == id {
updatedUser.ID = id
users[i] = updatedUser
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(updatedUser)
return
}
}
http.Error(w, "用户未找到", http.StatusNotFound)
}
删除用户
func deleteUser(w http.ResponseWriter, r *http.Request) {
id, err := strconv.Atoi(r.URL.Path[len("/users/"):])
if err != nil {
http.Error(w, "无效的用户ID", http.StatusBadRequest)
return
}
mu.Lock()
defer mu.Unlock()
for i, user := range users {
if user.ID == id {
users = append(users[:i], users[i+1:]...)
w.WriteHeader(http.StatusNoContent)
return
}
}
http.Error(w, "用户未找到", http.StatusNotFound)
}
基本上就这些。这个例子使用标准库实现了完整的RESTful API,数据保存在内存中,适合学习或小型项目。注意它没有持久化,重启后数据会丢失。实际项目中可扩展为使用数据库或加入验证、日志、中间件等。结构清晰,易于理解和修改。
以上就是如何用Golang创建一个RESTful API来对内存中的数据进行增删改查的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号