GO语言项目实战【二】——实现一个简单的crud系统

首先这是一个非常简单的增删改查系统,通过请求路径的不同以及请求方式的不同来做不同的操作。这边主要是使用GO语言实现以下,熟悉GO语言的语法,以及一些标准库和第三方包的使用。

1、这里使用到了一个第三方包:github.com/gorilla/mux,这是一个强大的请求路由器,用于将传入的HTTP请求映射到对应的处理函数上,还支持路由的路径变量、子路由、路由中间件、请求主机、查询字符串等高级功能。

2、简单学习了encoding标准库中处理json数据的方法,使用json.NewEncoder(w).Encode(movies)将movies切片编码成json格式,并写入io.Writer中。

下面直接上代码:

package main

import (
   "encoding/json"
   "fmt"
   "github.com/gorilla/mux"
   "log"
   rand "math/rand"
   "net/http"
   "strconv"
)

// 电影结构体
type Movie struct {
   ID       string    `json:"id"`
   Isbn     string    `json:"isbn"`
   Title    string    `json:"title"`
   Director *Director `json:"director"`
}

// 导演结构体
type Director struct {
   Firstname string `json:"firstname"`
   Lastname  string `json:"lastname"`
}

// 定义一个电影的切片
var movies []Movie

// 获取所有电影信息
func getMovies(w http.ResponseWriter, r *http.Request) {
   //设置http响应字段“Content-Type”为“application/json"
   w.Header().Set("Content-Type", "application/json")
   //将切片编码为json并返回
   json.NewEncoder(w).Encode(movies)
}

// 根据id删除电影
func deleteMovie(w http.ResponseWriter, r *http.Request) {
   w.Header().Set("Content-Type", "application/json")
   //从请求中提取路径参数,Vars函数将请求中的路径参数解析为一个map,所以这个params一个map,可以根据参数名来获取参数
   params := mux.Vars(r)
   //遍历切片
   for index, item := range movies {
      if item.ID == params["id"] {
         //将匹配的movie从切片删除  [:index]代表index之前的所有元素,[index+1:]...代表index之后的所有元素
         movies = append(movies[:index], movies[index+1:]...)
         break
      }
   }
   //返回所有电影
   json.NewEncoder(w).Encode(movies)
}

// 根据id所有movies
func getMovie(w http.ResponseWriter, r *http.Request) {
   w.Header().Set("Content-Type", "application/json")
   params := mux.Vars(r)
   for _, item := range movies {
      if item.ID == params["id"] {
         //返回id匹配的电影
         json.NewEncoder(w).Encode(item)
         return
      }
   }
}

// 创建一个电影
func createMovie(w http.ResponseWriter, r *http.Request) {
   w.Header().Set("Content-Type", "application/json")
   var movie Movie
   //解码请求体
   _ = json.NewDecoder(r.Body).Decode(&movie)
   //设置movie的id
   movie.ID = strconv.Itoa(rand.Intn(1000000))
   //将新的movie添加到切片
   movies = append(movies, movie)
   json.NewEncoder(w).Encode(movies)
}

// 根据id更新movie
func updateMovie(w http.ResponseWriter, r *http.Request) {
   w.Header().Set("Content-Type", "application/json")
   var movie Movie
   _ = json.NewDecoder(r.Body).Decode(&movie)
   for index, item := range movies {
      //匹配id相同的电影
      if item.ID == movie.ID {
         movies[index] = movie
      }
   }
   json.NewEncoder(w).Encode(movies)
}
func main() {
   r := mux.NewRouter()
   movies = append(movies, Movie{ID: "1", Isbn: "12345", Title: "肖生客的救赎", Director: &Director{Firstname: " Frank Darabont", Lastname: "Frank"}})
   movies = append(movies, Movie{ID: "2", Isbn: "23456", Title: "奥本海默", Director: &Director{Firstname: "Christopher Nolan", Lastname: "Christopher"}})
   movies = append(movies, Movie{ID: "3", Isbn: "34567", Title: "泰坦尼克号", Director: &Director{Firstname: "James Cameron", Lastname: "James"}})
   r.HandleFunc("/movies", getMovies).Methods("GET")
   r.HandleFunc("/movies/{id}", getMovie).Methods("GET")
   r.HandleFunc("/movies/", createMovie).Methods("POST")
   r.HandleFunc("/movies/{id}", updateMovie).Methods("PUT")
   r.HandleFunc("/movies/{id}", deleteMovie).Methods("DELETE")
   fmt.Printf("Starting server at port 8000\n")
   log.Fatal(http.ListenAndServe("localhost:8000", r))

}
  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值