解决golang结构体tag编译错误的问题


Posted in Golang onMay 02, 2021

写了一个带标签的结构体

type server struct{
 XMLName    xml.Name 'xml:"server"'
}

解决

编译错误field tag must be a string,后来发现是后面标签上引号不正确,不应该是回车键旁边的单引号,而是数字键1旁边的单引号

type server struct{
 XMLName    xml.Name `xml:"server"`
}

补充:golang中struct成员变量的标签(Tag)说明和获取方式

在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有小米点括起来的内容。形如:

type User struct {
    UserId   int    `json:"user_id" bson:"user_id"`
    UserName string `json:"user_name" bson:"user_name"`
}

这个小米点里的内容是用来干什么的呢?

struct成员变量标签(Tag)说明

要比较详细的了解这个,要先了解一下golang的基础,在golang中,命名都是推荐都是用驼峰方式,并且在首字母大小写有特殊的语法含义:包外无法引用。

但是由经常需要和其它的系统进行数据交互,例如转成json格式,存储到mongodb啊等等。

这个时候如果用属性名来作为键值可能不一定会符合项目要求。

所以呢就多了小米点的内容,在golang中叫标签(Tag),在转换成其它数据格式的时候,会使用其中特定的字段作为键值。

例如上例在转成json格式:

u := &User{UserId: 1, UserName: "tony"}
j, _ := json.Marshal(u)
fmt.Println(string(j))
// 输出内容:{"user_id":1,"user_name":"tony"}
  

如果在属性中不增加标签说明,则输出:

{"UserId":1,"UserName":"tony"}

可以看到直接用struct的属性名做键值。

其中还有一个bson的声明,这个是用在将数据存储到mongodb使用的。

struct成员变量标签(Tag)获取

那么当我们需要自己封装一些操作,需要用到Tag中的内容时,咋样去获取呢?这边可以使用反射包(reflect)中的方法来获取:

t := reflect.TypeOf(u)
field := t.Elem().Field(0)
fmt.Println(field.Tag.Get("json"))
fmt.Println(field.Tag.Get("bson"))

完整代码如下:

package main  
import (
    "encoding/json"
    "fmt"
    "reflect"
)
  
func main() {
    type User struct {
        UserId   int    `json:"user_id" bson:"user_id"`
        UserName string `json:"user_name" bson:"user_name"`
    }
    // 输出json格式
    u := &User{UserId: 1, UserName: "tony"}
    j, _ := json.Marshal(u)
    fmt.Println(string(j))
    // 输出内容:{"user_id":1,"user_name":"tony"}
  
    // 获取tag中的内容
    t := reflect.TypeOf(u)
    field := t.Elem().Field(0)
    fmt.Println(field.Tag.Get("json"))
    // 输出:user_id
    fmt.Println(field.Tag.Get("bson"))
    // 输出:user_id
}
  

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

Golang 相关文章推荐
go语言中json数据的读取和写出操作
Apr 28 Golang
使用Golang的channel交叉打印两个数组的操作
Apr 29 Golang
解决go在函数退出后子协程的退出问题
Apr 30 Golang
Golang全局变量加锁的问题解决
May 08 Golang
GoLang中生成UUID唯一标识的实现
May 08 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
Go 通过结构struct实现接口interface的问题
Oct 05 Golang
详解Golang如何优雅的终止一个服务
Mar 21 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
Golang 结构体数据集合
Apr 22 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 Golang
Go Grpc Gateway兼容HTTP协议文档自动生成网关
Jun 16 Golang
golang 实现Location跳转方式
May 02 #Golang
解决golang post文件时Content-Type出现的问题
May 02 #Golang
对Golang中的FORM相关字段理解
May 02 #Golang
解决go在函数退出后子协程的退出问题
Apr 30 #Golang
Go语言 go程释放操作(退出/销毁)
golang DNS服务器的简单实现操作
golang slice元素去重操作
Apr 30 #Golang
You might like
PHP获取用户的浏览器与操作系统信息的代码
2012/09/04 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
2014/10/22 PHP
javascript 面向对象全新理练之数据的封装
2009/12/03 Javascript
jquery中使用ajax获取远程页面信息
2011/11/13 Javascript
用js来获取上传的文件名纯粹是为了美化而用
2013/10/23 Javascript
angularjs基础教程
2014/12/25 Javascript
jQuery实现移动 和 渐变特效的点击事件
2015/02/26 Javascript
JavaScript Sort 的一个错误用法示例
2015/03/20 Javascript
JavaScript入门系列之知识点总结
2016/03/24 Javascript
javascript学习指南之回调问题
2016/04/23 Javascript
JS简单实现禁止访问某个页面的方法
2016/09/13 Javascript
基于vue2实现左滑删除功能
2017/11/28 Javascript
ionic3实战教程之随机布局瀑布流的实现方法
2017/12/28 Javascript
js实现微信/QQ直接跳转到支付宝APP打开口令领红包功能
2018/01/09 Javascript
浅谈angular4.0中路由传递参数、获取参数最nice的写法
2018/03/12 Javascript
Vue加载组件、动态加载组件的几种方式
2018/08/31 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
CryptoJS中AES实现前后端通用加解密技术
2018/12/18 Javascript
解决axios post 后端无法接收数据的问题
2019/10/29 Javascript
详解小程序如何改变onLoad的执行时机
2019/11/01 Javascript
javascript的delete运算符知识点总结
2019/11/19 Javascript
Python实现的简单发送邮件脚本分享
2014/11/07 Python
python发送邮件功能实现代码
2016/07/15 Python
python实现requests发送/上传多个文件的示例
2018/06/04 Python
python截取两个单词之间的内容方法
2018/12/25 Python
python自定义函数实现一个数的三次方计算方法
2019/01/20 Python
Python3连接Mysql8.0遇到的问题及处理步骤
2020/02/17 Python
用python介绍4种常用的单链表翻转的方法小结
2020/02/24 Python
django 装饰器 检测登录状态操作
2020/07/02 Python
澳大利亚领先的武术用品和健身器材供应商:SMAI
2019/03/24 全球购物
改变生活的男士内衣:SAXX Underwear
2019/08/28 全球购物
外企办公室竞聘演讲稿
2013/12/29 职场文书
高中校园广播稿3篇
2014/09/29 职场文书
公司借款担保书
2015/09/22 职场文书
2021-4-5课程——SQL Server查询【3】
2021/04/05 SQL Server
vue3引入highlight.js进行代码高亮的方法实例
2022/04/08 Vue.js