文章目录

  • golang结构体中使用tag标记
    • 简介
    • 语法结构
    • 快速入门
    • 常见应用
      • 应用json编码
      • 应用xml编码
      • 应用form表单绑定
      • gin框架form和数据绑定

golang结构体中使用tag标记

简介

我们可以在结构体的字段后面,添加一些对该字段的说明(元信息meta),程序通过反射解析这些信息并使用。

语法结构

`key:"value" key:"value"`

反引号括起来,key不加双引号,value加双引号,多个值中间用空格分开

快速入门

package mainimport ("fmt""reflect"
)func main() {type S struct {F string `species:"gopher" color:"blue"`}//实例化结构体,在这里没有使用到,所以空实例化s := S{}//使用反射获得结构体的type类型st := reflect.TypeOf(s)//拿到第一个字段field := st.Field(0)//拿到tag里面的东西fmt.Println(field.Tag.Get("color"), field.Tag.Get("species"))
}

运行结果:

[Running] go run "e:\golang开发学习\go_pro\main.go"
blue gopher[Done] exited with code=0 in 1.234 seconds

常见应用

应用json编码

package mainimport ("encoding/json""fmt""log""os""time"
)//一般我们字段名都是大写的,但是我们json里面都是小写的,这里就可以通过tag来使用小写来知道大写的字段
type User struct {Name      string    `json:"name"`Password  string    `json:"password"`CreatedAt time.Time `json:"createdAt"`
}func main() {u := &User{Name:      "Psych",Password:  "123456",CreatedAt: time.Now(),}out, err := json.MarshalIndent(u, "", " ")if err != nil {log.Println(err)os.Exit(1)}fmt.Println(string(out))
}

运行结果:

[Running] go run "e:\golang开发学习\go_pro\main.go"
{"name": "Psych","password": "123456","createdAt": "2022-09-09T16:58:24.0876915+08:00"
}[Done] exited with code=0 in 1.136 seconds

应用xml编码

package mainimport ("encoding/xml""fmt""os"
)func main() {type Address struct {City, State string}type Person struct {XMLName   xml.Name `xml:"person"`Id        int      `xml:"id,attr"` //attr代表属性FirstName string   `xml:"name>first"`LastName  string   `xml:"name>last"` //>代表子节点Age       int      `xml:"age"`Height    float32  `xml:"height,omitempty"`Married   boolAddressComment string `xml:"comment"`}v := &Person{Id: 13, FirstName: "Wong", LastName: "Psych", Age: 18}v.Comment = "注释."v.Address = Address{"四川", "成都"}output, err := xml.MarshalIndent(v, "", "   ")if err != nil {fmt.Printf("error:%v\n", err)}_, err = os.Stdout.Write(output)if err != nil {return}
}

运行结果:

[Running] go run "e:\golang开发学习\go_pro\main.go"
<person id="13"><name><first>Wong</first><last>Psych</last></name><age>18</age><Married>false</Married><City>四川</City><State>成都</State><comment>注释.</comment>
</person>
[Done] exited with code=0 in 1.248 seconds

应用form表单绑定

可以写多个tag标签,使用空格分开

type Channel struct {Id      uint64 `form:"id" gorm:"primaryKey"`Title   string `form:"title" gorm:"title"`Slug    string `form:"slug" gorm:"slug"`Content string `form:"content" gorm:"content"`Status  int    `form:"status" gorm:"status"`Weight  int    `form:"weight" gorm:"weight"`
}

gin框架form和数据绑定

package mainimport "C"
import ("github.com/gin-gonic/gin""net/http"
)type Login struct {//form:表单中的name一般是小写的id,json:前后端分离返回给前端的参数,binding:字段校验User     string `form:"user" json:"user" binding:"required"`Password string `form:"password" json:"password" binding:"required"`
}func main() {router := gin.Default()// 绑定 JSON ({"user":"manu","password":"123"})router.POST("/loginJSON", func(c *gin.Context) {var json Loginif err := c.ShouldBindJSON(&json); err == nil {if json.User == "manu" && json.Password == "123" {c.JSON(http.StatusOK, gin.H{"status": "成功登录"})} else {c.JSON(http.StatusUnauthorized, gin.H{"status": "未授权"})}} else {C.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})}})//HTML form (user=manu&password=123)router.POST("/loginForm", func(c *gin.Context) {var form Loginif err := c.ShouldBind(&form); err == nil {if form.User == "manu" && form.Password == "123" {c.JSON(http.StatusOK, gin.H{"status": "成功登录"})} else {c.JSON(http.StatusUnauthorized, gin.H{"status": "未授权"})}} else {C.JSON(http.StatusBadRequest, gin.H{"error": err.Error})}})
}

Go语言学习笔记——结构体中使用tag标记相关推荐

  1. C语言学习笔记---结构体中的字符数组和字符指针

      在结构体中可以使用字符数组来存储字符串,也可以使用字符指针来存储字符串.比如: struct str{char s1[5];char s2[5];};struct str str1= {" ...

  2. c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...

    C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...

  3. C语言学习笔记---结构体的定义和初始化

      在C语言中结构体通常用来将不同类型的变量打包在一起,方便对对象的统一管理. 结构体定义   要使用结构体时,首先要进行结构体的声明.声明的形式如下: struct 结构体名{ 结构体所包含的变量} ...

  4. C语言学习笔记---结构体指针

      既然结构体是一种数据类型,那么除了使用变量本身来访问结构体之外,也可以使用指针来访问结构体.下面通过一个简单的例子来演示一下: struct Date{int year;int month;int ...

  5. C语言学习笔记---结构体作为函数参数和返回值

      结构体不仅可以作为函数的参数传递,也可以作为函数的返回值.现在就分别来看一下这两种情况. 结构体作为参数 struct score {int chinese;int math;int englis ...

  6. C语言学习笔记---结构体数组初始化

      既然结构体是一种数据类型,那么它也可以定义为数组的形式.比如要描述一本书的信息,可以将书的名称,作者,价格这些信息用一个结构体来描述,在使用的过程中不可能只描述一本书,所以就需要使用一个结构体数组 ...

  7. SV学习笔记—结构体及枚举类型及字符串

    目录 1.结构体 1.1 压缩结构体 1.2 非压缩结构体 1.3联合结构体 2.枚举类型 3.字符串 1.结构体 Verilog的最大缺陷之一是没有数据结构,SV中可以使用struct语句创建结构, ...

  8. C语言如何获取结构体中指定元素的大小?sizeof ( (X*)0 ) -> Y)(空指针操作)

    获取结构体的大小,这好办,这样就可以了: #include <stdio.h>struct user {char name[20];char age[10]; };int main() { ...

  9. Go语言学习、结构体

    最近疫情比较严重,过年也不能出门,闲来无事,继续更新博客吧. 武汉加油! 我们来继续说下go语言中的结构体 比如我们现在想存储一个学生信息,如:学号.姓名.年龄.性别,等信息,按照我们以前的存储习惯, ...

最新文章

  1. Java的Map遍历
  2. eclipse性能优化
  3. 基于MQTT协议进行应用开发
  4. toCharArray()和 charAt()的用法
  5. 错误契约(FaultContract)与异常处理(转)
  6. Linux下安装和卸载jdk及环境配置
  7. 转 十道海量数据处理面试题与十个方法大总结
  8. 免费下载微软原厂Win11镜像ISO文件
  9. 小米10获取root权限_2020年小米红米Miflash新版刷机救砖恢复去除ROOT权限教程
  10. 程序员的职业规划_程序员如何能做好职业规划,走出迷惘呢?这个能力矩阵法要告诉你...
  11. python实现微信hook_GitHub - gemgin/wechathook: 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取...
  12. ICON图标设计零基础到精通(UI进阶)
  13. 17位时间戳转换为Unix时间戳及转换工具,代码实现转换 WebKit/Chrome Timestamp Converter
  14. 2020ICPC·小米 网络选拔赛第一场(Matrix Subtraction (二维差分))
  15. 《青春》英语美文欣赏(中英对照)
  16. java——》Supplie
  17. IIS Ceb文件允许下载
  18. GLib核心应用支持
  19. 浅析商业银行保理业务风险类型
  20. 石川: 主流多因子模型巡礼

热门文章

  1. 最伤害眼睛的7大恶习
  2. SSM健身系统APP-计算机毕设 附源码90470
  3. VSIX(VSCode插件)安装方法
  4. STM32 CubeMax 编码器电机测速 原理与实现
  5. mongo数据库迁移
  6. HDLBits(十 三)学习笔记——Building Lager Circuits (1000计数器 —— FSM:One-hot logic equations独热码)
  7. mysql还原1418错误_MySQL 出现错误1418 的原因分析及解决方法
  8. 大数据和云计算技术周报(第83期)
  9. solr7.7.3安装
  10. Android开发5年,分享下初级 中级 高级工程师 划分标准