解决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:垃圾回收GC触发条件详解
Apr 24 Golang
Golang 实现超大文件读取的两种方法
Apr 27 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
Golang 如何实现函数的任意类型传参
Apr 29 Golang
Go 自定义package包设置与导入操作
May 06 Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 Golang
golang中字符串MD5生成方式总结
Jul 04 Golang
入门学习Go的基本语法
Jul 07 Golang
Go语言读取txt文档的操作方法
Jan 22 Golang
Go语言实现一个简单的并发聊天室的项目实战
Mar 18 Golang
深入理解 Golang 的字符串
May 04 Golang
Go gorilla/sessions库安装使用
Aug 14 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 定界符 使用技巧
2009/06/14 PHP
php 随机记录mysql rand()造成CPU 100%的解决办法
2010/05/18 PHP
PHP中round()函数对浮点数进行四舍五入的方法
2014/11/19 PHP
PHP获取当前日期和时间及格式化方法参数
2015/05/11 PHP
jQuery的实现原理的模拟代码 -2 数据部分
2010/08/01 Javascript
Javascript的各种节点操作实例演示代码
2012/06/27 Javascript
JQuery之focus函数使用介绍
2013/08/20 Javascript
javascript随机将第一个dom中的图片添加到第二个div中示例
2013/10/08 Javascript
JavaScript实现瀑布流布局
2020/06/28 Javascript
JS中使用DOM来控制HTML元素
2016/07/31 Javascript
JavaScript中对象的不同创建方法
2016/08/12 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
2016/11/02 Javascript
基于js实现二级下拉联动
2016/12/17 Javascript
bootstrap输入框组使用方法
2017/02/07 Javascript
jQuery实现基本隐藏与显示效果的方法详解
2018/09/05 jQuery
vue踩坑记录之数组定义和赋值问题
2019/03/20 Javascript
webpack结合express实现自动刷新的方法
2019/05/07 Javascript
AngularJS实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 Javascript
python 七种邮件内容发送方法实例
2014/04/22 Python
Python读写文件方法总结
2015/06/09 Python
解析Python中的__getitem__专有方法
2016/06/27 Python
Python3.x爬虫下载网页图片的实例讲解
2018/05/22 Python
pytorch 加载(.pth)格式的模型实例
2019/08/20 Python
Python time库基本使用方法分析
2019/12/13 Python
Python2和Python3中@abstractmethod使用方法
2020/02/04 Python
CSS3教程(7):CSS3嵌入字体
2009/04/02 HTML / CSS
HTML5本地存储之Web Storage应用介绍
2013/01/06 HTML / CSS
图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传
2016/01/20 HTML / CSS
详解html5 canvas 微信海报分享(个人爬坑)
2018/01/12 HTML / CSS
金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)-> (一千零一拾一元整)输出
2015/05/29 面试题
省三好学生申请材料
2014/01/22 职场文书
党的群众路线教育实践活动党员个人整改措施
2014/10/27 职场文书
2014年城管工作总结
2014/11/20 职场文书
2015年感恩父亲节演讲稿
2015/03/19 职场文书
新入职员工工作总结
2015/10/15 职场文书