golang中json和struct的使用说明

 更新时间:2021年05月01日 11:05:25   作者:springlustre  
这篇文章主要介绍了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

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

相关文章

  • Go语言select语句用法示例

    Go语言select语句用法示例

    这篇文章主要为大家介绍了Go语言select语句用法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Go语言--切片(Slice)详解

    Go语言--切片(Slice)详解

    这篇文章主要介绍了Go语言--切片(Slice),Go 语言切片是对数组的抽象,下面文章小编将为大家详细介绍该内容,需要的朋友可以参考下,希望对你有所帮助
    2021-10-10
  • Go语言同步等待组sync.WaitGroup结构体对象方法详解

    Go语言同步等待组sync.WaitGroup结构体对象方法详解

    这篇文章主要为大家介绍了Go语言同步等待组sync.WaitGroup结构体对象方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • MacOS下本地golang环境搭建详细教程

    MacOS下本地golang环境搭建详细教程

    这篇文章主要介绍了MacOS下本地golang环境搭建详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • gin解析json格式的数据出错的处理方案

    gin解析json格式的数据出错的处理方案

    这篇文章主要介绍了gin解析json格式的数据出错的处理方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • golang语言中for循环语句用法实例

    golang语言中for循环语句用法实例

    这篇文章主要介绍了golang语言中for循环语句用法,实例分析了for循环遍历的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • go程序中同一个包下为什么会存在多个同名的函数或变量(详细解析)

    go程序中同一个包下为什么会存在多个同名的函数或变量(详细解析)

    这篇文章主要介绍了go程序中同一个包下为什么会存在多个同名的函数或变量(详细解析),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-05-05
  • Go标准库日志打印及同时输出到控制台与文件

    Go标准库日志打印及同时输出到控制台与文件

    Go语言内置的log包实现了简单的日志服务,下面这篇文章主要给大家介绍了关于Go标准库日志打印及同时输出到控制台与文件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • Go语言设计模式之结构型模式

    Go语言设计模式之结构型模式

    本文主要聚焦在结构型模式(Structural Pattern)上,其主要思想是将多个对象组装成较大的结构,并同时保持结构的灵活和高效,从程序的结构上解决模块之间的耦合问题
    2021-06-06
  • 详解Go语言中iota的应用

    详解Go语言中iota的应用

    在本文中,小编将带着大家深入探讨 iota 的神奇力量,包括 iota 的介绍和应用场景以及使用技巧和注意事项,准备好了吗,准备一杯你最喜欢的饮料或茶,随着本文一探究竟吧
    2023-07-07

最新评论