golang增删改查接口
时间: 2023-07-08 12:20:31 浏览: 171
以下是一个简单的 golang 增删改查接口的示例代码:
```go
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"strconv"
"strings"
)
// 定义一个结构体表示数据模型
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
}
// 定义一个切片存储数据
var users []User
// 获取所有数据
func getUsers(w http.ResponseWriter, r *http.Request) {
// 将 users 切片转换为 json 字符串
usersJSON, err := json.Marshal(users)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// 设置响应头
w.Header().Set("Content-Type", "application/json")
// 将 json 字符串写入响应体
w.Write(usersJSON)
}
// 获取单个数据
func getUser(w http.ResponseWriter, r *http.Request) {
// 解析 URL 中的参数
id, err := strconv.Atoi(strings.TrimPrefix(r.URL.Path, "/users/"))
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
// 遍历 users 切片查找指定 id 的数据
for _, user := range users {
if user.ID == id {
// 将 user 结构体转换为 json 字符串
userJSON, err := json.Marshal(user)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// 设置响应头
w.Header().Set("Content-Type", "application/json")
// 将 json 字符串写入响应体
w.Write(userJSON)
return
}
}
// 如果没有找到指定 id 的数据,返回 404 Not Found
http.NotFound(w, r)
}
// 创建数据
func createUser(w http.ResponseWriter, r *http.Request) {
// 解析请求体中的 json 数据
var user User
err := json.NewDecoder(r.Body).Decode(&user)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
// 生成 id
if len(users) == 0 {
user.ID = 1
} else {
user.ID = users[len(users)-1].ID + 1
}
// 将新数据添加到 users 切片
users = append(users, user)
// 将 user 结构体转换为 json 字符串
userJSON, err := json.Marshal(user)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// 设置响应头
w.Header().Set("Content-Type", "application/json")
// 将 json 字符串写入响应体
w.Write(userJSON)
}
// 更新数据
func updateUser(w http.ResponseWriter, r *http.Request) {
// 解析 URL 中的参数
id, err := strconv.Atoi(strings.TrimPrefix(r.URL.Path, "/users/"))
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
// 遍历 users 切片查找指定 id 的数据
for i, user := range users {
if user.ID == id {
// 解析请求体中的 json 数据
var newUser User
err := json.NewDecoder(r.Body).Decode(&newUser)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
// 更新数据
users[i].Name = newUser.Name
users[i].Email = newUser.Email
// 将更新后的数据转换为 json 字符串
userJSON, err := json.Marshal(users[i])
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// 设置响应头
w.Header().Set("Content-Type", "application/json")
// 将 json 字符串写入响应体
w.Write(userJSON)
return
}
}
// 如果没有找到指定 id 的数据,返回 404 Not Found
http.NotFound(w, r)
}
// 删除数据
func deleteUser(w http.ResponseWriter, r *http.Request) {
// 解析 URL 中的参数
id, err := strconv.Atoi(strings.TrimPrefix(r.URL.Path, "/users/"))
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
// 遍历 users 切片查找指定 id 的数据
for i, user := range users {
if user.ID == id {
// 从 users 切片中删除指定数据
users = append(users[:i], users[i+1:]...)
// 返回空响应体
w.WriteHeader(http.StatusNoContent)
return
}
}
// 如果没有找到指定 id 的数据,返回 404 Not Found
http.NotFound(w, r)
}
func main() {
// 初始化数据
users = []User{
{
ID: 1,
Name: "Alice",
Email: "alice@example.com",
},
{
ID: 2,
Name: "Bob",
Email: "bob@example.com",
},
{
ID: 3,
Name: "Charlie",
Email: "charlie@example.com",
},
}
// 注册路由
http.HandleFunc("/users", getUsers)
http.HandleFunc("/users/", getUser)
http.HandleFunc("/users", createUser).Methods("POST")
http.HandleFunc("/users/", updateUser).Methods("PUT")
http.HandleFunc("/users/", deleteUser).Methods("DELETE")
// 启动服务器
log.Fatal(http.ListenAndServe(":8080", nil))
}
```
上述代码使用 `net/http` 包提供的路由注册函数 `http.HandleFunc` 注册了以下路由:
- GET /users:获取所有数据
- GET /users/{id}:获取单个数据
- POST /users:创建数据
- PUT /users/{id}:更新数据
- DELETE /users/{id}:删除数据
其中,`POST` 和 `PUT` 请求使用了第三方包 `github.com/gorilla/mux` 提供的 `Methods` 方法限制请求方法。如果不使用该方法,可以使用 `http.MethodPost` 和 `http.MethodPut` 常量分别代表 POST 和 PUT 请求方法。
阅读全文