解决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 相关文章推荐
golang中的空slice案例
Apr 27 Golang
golang 实现菜单树的生成方式
Apr 28 Golang
golang 如何通过反射创建新对象
Apr 28 Golang
解决golang在import自己的包报错的问题
Apr 29 Golang
golang elasticsearch Client的使用详解
May 05 Golang
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
May 05 Golang
Golang: 内建容器的用法
May 05 Golang
解决goland 导入项目后import里的包报红问题
May 06 Golang
GoLang中生成UUID唯一标识的实现
May 08 Golang
go goroutine 怎样进行错误处理
Jul 16 Golang
Go语言怎么使用变长参数函数
Jul 15 Golang
Go语言测试库testify使用学习
Jul 23 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的pcntl多进程用法实例
2015/03/19 PHP
thinkPHP自动验证、自动添加及表单错误问题分析
2016/10/17 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
2017/10/07 PHP
HTML中事件触发列表与解说
2007/07/09 Javascript
使用Grunt.js管理你项目的应用说明
2013/04/24 Javascript
Jquery 实现table样式的设定
2015/01/28 Javascript
js实现双击图片放大单击缩小的方法
2015/02/17 Javascript
Javascript中3个需要注意的运算符
2015/04/02 Javascript
vue.js表格分页示例
2016/10/18 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
2017/01/13 Javascript
Bootstrap轮播图学习使用
2017/02/10 Javascript
ES6学习之变量的解构赋值
2017/02/12 Javascript
利用Jquery实现几款漂亮实用的时间轴(附示例代码)
2017/02/15 Javascript
深入理解Vue 的条件渲染和列表渲染
2017/09/01 Javascript
jQuery插件实现图片轮播效果
2020/10/19 jQuery
JavaScript/TypeScript 实现并发请求控制的示例代码
2021/01/18 Javascript
python和shell变量互相传递的几种方法
2013/11/20 Python
Python实现简单的四则运算计算器
2016/11/02 Python
Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】
2017/06/20 Python
Python文件和流(实例讲解)
2017/09/12 Python
python数字图像处理之骨架提取与分水岭算法
2018/04/27 Python
基于windows下pip安装python模块时报错总结
2018/06/12 Python
数据清洗--DataFrame中的空值处理方法
2018/07/03 Python
Tornado Web Server框架编写简易Python服务器
2018/07/28 Python
python matplotlib库绘制条形图练习题
2019/08/10 Python
Django框架 信号调度原理解析
2019/09/04 Python
python使用yield压平嵌套字典的超简单方法
2019/11/02 Python
水果花束:Fruit Bouquets
2017/12/20 全球购物
英国领先的运动营养品牌:Protein Dynamix
2018/01/02 全球购物
加拿大大码女装购物网站:Penningtons
2020/12/26 全球购物
应用电子专业学生的自我评价
2013/10/16 职场文书
化工专业大学生职业生涯规划书
2014/01/14 职场文书
2014年迎新年活动方案
2014/02/19 职场文书
小学捐书活动总结
2014/07/05 职场文书
电力企业职工培训心得体会
2016/01/11 职场文书
详解Mysql和Oracle之间的误区
2021/05/18 MySQL