解决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项目中使用init()
Apr 12 Golang
Go语言操作数据库及其常规操作的示例代码
Apr 21 Golang
Go语言使用select{}阻塞main函数介绍
Apr 25 Golang
golang 如何通过反射创建新对象
Apr 28 Golang
浅谈golang 中time.After释放的问题
May 05 Golang
解决golang 关于全局变量的坑
May 06 Golang
go mod 安装依赖 unkown revision问题的解决方案
May 06 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
Golang数据类型和相互转换
Apr 12 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
golang生成并解析JSON
Apr 14 Golang
golang用type-switch判断interface的实际存储类型
Apr 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
用mysql内存表来代替php session的类
2009/02/01 PHP
用javascript实现在小方框中浏览大图的代码
2007/08/14 Javascript
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
2010/07/13 Javascript
JavaScript中使用正则匹配多条,且获取每条中的分组数据
2010/11/30 Javascript
JQuery魔力之$("tagName")与selector
2012/03/05 Javascript
jQuery :first选择器使用介绍
2013/08/09 Javascript
纯Javascript实现Windows 8 Metro风格实现
2013/10/15 Javascript
网页右侧悬浮滚动在线qq客服代码示例
2014/04/28 Javascript
javascript实现多栏闭合展开式广告位菜单效果实例
2015/08/05 Javascript
JavaScript中Window对象的属性及事件
2015/12/25 Javascript
jquery实现简单的遮罩层
2016/01/08 Javascript
node.js实现端口转发
2016/04/14 Javascript
jQuery模拟12306城市选择框功能简单实现方法示例
2018/08/13 jQuery
vue实现div拖拽互换位置
2020/07/29 Javascript
vue element自定义表单验证请求后端接口验证
2019/12/11 Javascript
jquery实现垂直手风琴导航栏
2020/02/18 jQuery
用Python实现协同过滤的教程
2015/04/08 Python
python 中split 和 strip的实例详解
2017/07/12 Python
python实现rsa加密实例详解
2017/07/19 Python
Python进阶之递归函数的用法及其示例
2018/01/31 Python
pandas读取csv文件,分隔符参数sep的实例
2018/12/12 Python
Python基于plotly模块实现的画图操作示例
2019/01/23 Python
Python 利用切片从列表中取出一部分使用的方法
2019/02/01 Python
Python中的引用知识点总结
2019/05/20 Python
浅谈python3中input输入的使用
2019/08/02 Python
基于Python获取城市近7天天气预报
2019/11/26 Python
Python3的unicode编码转换成中文的问题及解决方案
2019/12/10 Python
解决TensorFlow GPU版出现OOM错误的问题
2020/02/03 Python
Python气泡提示与标签的实现
2020/04/01 Python
土耳其家居建材网站:Koçtaş
2016/11/22 全球购物
培训讲师邀请函
2014/01/10 职场文书
高二历史教学反思
2014/01/25 职场文书
关于祖国的演讲稿
2014/05/04 职场文书
协议书范文
2015/01/27 职场文书
2019年亲子运动会口号
2019/10/11 职场文书
2019年励志签名:致拼搏路上的自己
2019/10/11 职场文书