解决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原生库的中bytes.Buffer用法
Apr 25 Golang
golang在GRPC中设置client的超时时间
Apr 27 Golang
解决Golang中ResponseWriter的一个坑
Apr 27 Golang
Golang Gob编码(gob包的使用详解)
May 07 Golang
Golang中异常处理机制详解
Jun 08 Golang
Go语言设计模式之结构型模式
Jun 22 Golang
golang内置函数len的小技巧
Jul 25 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
golang语言指针操作
Apr 14 Golang
Golang 结构体数据集合
Apr 22 Golang
Go语言入门exec的基本使用
May 20 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
DOTA2 玩家自创拉野攻略 特色英雄快速成长篇
2020/04/20 DOTA
一个用php实现的获取URL信息的类
2007/01/02 PHP
php fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
2011/05/24 PHP
PHP 清空varnish 缓存的详解(包括指定站点下的)
2013/06/20 PHP
PHP汉字转换拼音的函数代码
2015/12/30 PHP
javascript控制swfObject应用介绍
2012/11/29 Javascript
js多级树形弹出一个小窗口层(非常好用)实例代码
2013/03/19 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
捕获浏览器关闭、刷新事件不同情况下的处理方法
2013/06/02 Javascript
使用js判断TextBox控件值改变然后出发事件
2014/03/07 Javascript
特殊情况下如何获取span里面的值
2014/05/20 Javascript
jQuery实现复选框批量选择与反选的方法
2015/06/17 Javascript
JavaScript中的this机制
2016/01/30 Javascript
AngularJS控制器继承自另一控制器
2016/05/09 Javascript
jQuery如何获取动态添加的元素
2016/06/24 Javascript
Bootstrap轮播插件中图片变形的终极解决方案 使用jqthumb.js
2016/07/10 Javascript
浅析JavaScript函数的调用模式
2016/08/10 Javascript
对angularjs框架下controller间的传值方法详解
2018/10/08 Javascript
extjs图表绘制之条形图实现方法分析
2020/03/06 Javascript
vue实现简单计算商品价格
2020/09/14 Javascript
python打开文件并获取文件相关属性的方法
2015/04/23 Python
python 读写txt文件 json文件的实现方法
2016/10/22 Python
python 实现批量xls文件转csv文件的方法
2018/10/23 Python
详解分布式任务队列Celery使用说明
2018/11/29 Python
python判断一个对象是否可迭代的例子
2019/07/22 Python
HelloFresh奥地利:立即订购烹饪盒
2019/02/22 全球购物
英国婴儿及儿童产品商店:TigerParrot
2019/03/04 全球购物
Amara德国:家居饰品、设计师品牌和豪华礼品
2019/05/20 全球购物
NYX Professional Makeup英国官网:美国平价专业彩妆品牌
2019/11/13 全球购物
夏季奶茶店创业计划书
2014/01/16 职场文书
汽车维修工岗位职责
2014/02/12 职场文书
企业宗旨标语
2014/06/10 职场文书
四风问题党员个人整改措施
2014/10/27 职场文书
2015领导干部廉洁自律工作总结
2015/07/23 职场文书
反腐倡廉心得体会2016
2016/01/13 职场文书
SpringBoot中获取profile的方法详解
2022/04/08 Java/Android