基于Gin框架的web开发,总的来讲有两种:

  • 第一种是后端应用go语言模板引擎实现整个web全栈开发,返回残缺的html文件给浏览器。
  • 第二种是前后端拆散,应用JSON交互

因为第一种办法消耗太多网络资源,性能差,耦合度高,目前曾经根本被第二种模式取代,这篇博客只介绍如何在Gin框架中返回JSON数据给前端或者挪动端(俗称JSON的渲染)。


生成JSON数据能够用map,也能够用构造体。上面先介绍map:

基于map的JSON数据生成

举个例子,代码如下:

package mainimport (    "github.com/gin-gonic/gin"    "net/http")func main() {    r := gin.Default()    r.GET("/json", func(c *gin.Context) {        //这里结构服务器要返回前端的数据,一共有两种办法,第一种是:应用map将数据序列化        //,这个map的key是一个string, value是一个空的接口(这样即能够实现接管任意类型的数据)        data := map[string]interface{}{            "name":    "liber",            "message": "hey liber~",            "age":     16,        }        //这里要返回json格局的数据,所以用c.JSON,这样,数据就返回给申请方了        c.JSON(http.StatusOK, data)    })    r.Run(":9090")}

测试后果如下:

因为用map来序列化json数据是很常见的写法,Gin框架的作者将这种写法封装了一下:

//H is a shortcut for map[string]interface{}type H map[string]interface{}

所以,咱们能够间接应用gin.H{}来代替:

package mainimport (    "github.com/gin-gonic/gin"    "net/http")func main() {    r := gin.Default()    r.GET("/json", func(c *gin.Context) {        //这里结构服务器要返回前端的数据,一共有两种办法,第一种是:应用map将数据序列化        //,这个map的key是一个string, value是一个空的接口(这样即能够实现接管任意类型的数据)        //data := map[string]interface{}{        //    "name":    "liber",        //    "message": "hey liber~",        //    "age":     16,        //}        data := gin.H{            "name":    "libro",            "message": "hey libro~",            "age":     17,        }        //这里要返回json格局的数据,所以用c.JSON,这样,数据就返回给申请方了        c.JSON(http.StatusOK, data)    })    r.Run(":9090")}

测试后果如下:

基于构造体的JSON数据生成

其实就是另一种写法而已:

package mainimport (    "github.com/gin-gonic/gin"    "net/http")func main() {    r := gin.Default()    r.GET("/json", func(c *gin.Context) {        //这里结构服务器要返回前端的数据,一共有两种办法,第一种是:应用map将数据序列化        //,这个map的key是一个string, value是一个空的接口(这样即能够实现接管任意类型的数据)        //data := map[string]interface{}{        //    "name":    "liber",        //    "message": "hey liber~",        //    "age":     16,        //}        data := gin.H{            "name":    "libro",            "message": "hey libro~",            "age":     17,        }        //这里要返回json格局的数据,所以用c.JSON,这样,数据就返回给申请方了        c.JSON(http.StatusOK, data)    })    //这里介绍生成JSON数据的第二种办法:利用构造体    //首先结构一个构造体    type msg struct {        Name    string        Message string        Age     int    }    //而后构建一个构造体的实例    r.GET("/another_json", func(c *gin.Context) {        data := msg{            Name:    "libro",            Message: "hey libro~",            Age:     17,        }        c.JSON(http.StatusOK, data)    })    r.Run(":9090")}

测试后果如图:

不过须要留神的是,如果应用构造体,字段结尾字母必须大写,否则就没方法实现JSON的序列化,因为JSON序列化过程中应用到了Go内置的反射机制,小写示意不可导出。当然这也有解决之道,就是打tag:

//这里假如 前端就须要小写的name    type msg struct {        Name    string `json: "name"`        Message string        Age     int    }

其实我感觉,既然有坑,间接规定用第一种办法躲避掉是一种简洁&理智的抉择。


参考: bilibili