• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    golang中json和struct的使用说明

    1、返回json响应结果

    在struct的字段后面加入json:"key"可以进行json格式输出,其中key为json的键名

    type SuccessResponse struct {
       Code int         `json:"code"`
       Msg  string      `json:"msg"`
       Data interface{} `json:"data"`
    }
    func SuccessRsp(ctx *gin.Context, data interface{}) {
       res := SuccessResponse{
          Code: 0,
          Msg:  "success",
          Data: data,
       }
       ctx.JSON(http.StatusOK, res)
    }
    type MyData struct {
       Id    int         `json:"id"`
       Name  string      `json:"name"`
    }
    func ListAllOncallPlan(ctx *gin.Context)  {
       //你的业务代码
       //......
       data = Mydata{Id:1, Name:"zhangsan"}
       SuccessRsp(ctx, plans)
    }
    响应的结果为:
    {
       "code": 0,
       "msg": "ok",
       "data": {
          "id": 1,
          "name": "zhangsan"
       }
    }
    

    tips:

    1.如果struct的某个字段没有传值,则输出的json为默认值,可以通过"omitempty"参数忽略掉值为空的键

    type MyData struct {
       Id    int         `json:"id,omitempty"`
       Name  string      `json:"name"`
    }
    data = Mydata{Name:"zhangsan"}
    SuccessRsp(ctx, plans)
    

    则id的键会被忽略掉,输出json为:

    {
       "code": 0,
       "msg": "ok",
       "data": {
          "name": "zhangsan"
       }
    }

    2.可以用"-"来完全掉忽略掉某个键, 比如下面的id不会被转化到json字段中

    type MyData struct {
       Id    int         `json:"-"`
       Name  string      `json:"name"`
    }

    2、将数据库的字段转化成struct

    如果使用gorm框架进行数据库连接,则可以用gorm:"column:key"来指定数据库的键,如下所示

    type User struct {
       Id          int64     `gorm:"column:id" json:"id"`
       Name        string    `gorm:"column:name" json:"name,omitempty"`
    }
    

    补充:golang 一键生成 form,json,gorm标签

    每次有新表产生时,就会有新的model,model编写完后,繁杂的标签注解令人烦躁,所以写了这样的工具。

    func AddJsonFormGormTag(in string) (string) {
    	var result string
    	scanner := bufio.NewScanner(strings.NewReader(in))
    	var oldLineTmp = ""
    	var lineTmp = ""
    	var propertyTmp = ""
    	var seperateArr []string
    	for scanner.Scan() {
    		oldLineTmp = scanner.Text()
    		lineTmp = strings.Trim(scanner.Text(), " ")
    		if strings.Contains(lineTmp, "{") || strings.Contains(lineTmp, "}") {
    			result = result + oldLineTmp + "\n"
    			continue
    		}
    		seperateArr = Split(lineTmp, " ")
    		// 接口或者父类声明不参与tag, 自带tag不参与tag
    		if len(seperateArr) == 1 || len(seperateArr) == 3 {
    			continue
    		}
    		propertyTmp = HumpToUnderLine(seperateArr[0])
    		oldLineTmp = oldLineTmp + fmt.Sprintf("    `gorm:\"column:%s\" json:\"%s\" form:\"%s\"`", propertyTmp, propertyTmp, propertyTmp)
    		result = result + oldLineTmp + "\n"
    	}
    	return result
    }
    // 增强型split,对  a,,,,,,,b,,c     以","进行切割成[a,b,c]
    func Split(s string, sub string) []string {
    	var rs = make([]string, 0, 20)
    	tmp := ""
    	Split2(s, sub, tmp, rs)
    	return rs
    }
    // 附属于Split,可独立使用
    func Split2(s string, sub string, tmp *string, rs *[]string) {
    	s = strings.Trim(s, sub)
    	if !strings.Contains(s, sub) {
    		*tmp = s
    		*rs = append(*rs, *tmp)
    		return
    	}
    	for i, _ := range s {
    		if string(s[i]) == sub {
    			*tmp = s[:i]
    			*rs = append(*rs, *tmp)
    			s = s[i+1:]
    			Split2(s, sub, tmp, rs)
    			return
    		}
    	}
    }
    // 驼峰转下划线
    func HumpToUnderLine(s string) string{
    	if s =="ID" {
    		return "id"
    	}
    	var rs string
    	elements:=FindUpperElement(s)
    	for _,e :=range elements{
    		s =strings.Replace(s, e, "_"+strings.ToLower(e),-1)
    	}
    	rs = strings.Trim(s," ")
    	rs = strings.Trim(rs,"\t")
    	return strings.Trim(rs,"_")
    }
    // 找到字符串中大写字母的列表,附属于HumpToUnderLine
    func FindUpperElement(s string) []string {
    	var rs = make([]string, 0, 10)
    	for i := range s {
    		if s[i] >= 65  s[i] = 90 {
    			rs = append(rs, string(s[i]))
    		}
    	}
    	return rs
    }
    

    如何使用

    func TestAddJsonFormTag(t *testing.T) {
     rs := AddJsonFormGormTag(`
     type User struct{
      Id        uint64
      NameSpace  string
      DailyRoutine int
     }
     `)
     fmt.Println(rs)
    }

    结果

     type User struct{
      Id        uint64    `gorm:"column:id" json:"id" form:"id"`
      NameSpace  string    `gorm:"column:name_space" json:"name_space" form:"name_space"`
      DailyRoutine int    `gorm:"column:daily_routine" json:"daily_routine" form:"daily_routine"`
     }

    具体对齐,使用go fmt xxx.go 命令

    goland 快捷键是 ctrl alt L

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

    您可能感兴趣的文章:
    • golang跳转语句goto,break,continue的使用及区别说明
    • 对Golang中的FORM相关字段理解
    • golang 打印error的堆栈信息操作
    • golang coroutine 的等待与死锁用法
    • golang DNS服务器的简单实现操作
    • golang slice元素去重操作
    • Golang中interface{}转为数组的操作
    • golang 实现一个负载均衡案例(随机,轮训)
    • golang 实现Location跳转方式
    上一篇:golang coroutine 的等待与死锁用法
    下一篇:golang 打印error的堆栈信息操作
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    golang中json和struct的使用说明 golang,中,json,和,struct,的,