解决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语言中切片与内存复制 memcpy 的实现操作
Apr 27 Golang
golang日志包logger的用法详解
May 05 Golang
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
May 05 Golang
go mod 安装依赖 unkown revision问题的解决方案
May 06 Golang
Go遍历struct,map,slice的实现
Jun 13 Golang
浅谈Go语言多态的实现与interface使用
Jun 16 Golang
Go语言应该什么情况使用指针
Jul 25 Golang
golang中的struct操作
Nov 11 Golang
Golang数据类型和相互转换
Apr 12 Golang
Golang map映射的用法
Apr 22 Golang
Golang 结构体数据集合
Apr 22 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 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 中英文混合排版中处理字符串常用的函数
2007/04/12 PHP
PHP的PSR规范中文版
2013/09/28 PHP
php生成短域名函数
2015/03/23 PHP
PHP 常用时间函数资料整理
2016/10/22 PHP
php PDO实现的事务回滚示例
2017/03/23 PHP
JS分割字符串并放入数组的函数
2011/07/04 Javascript
在jQuery ajax中按钮button和submit的区别分析
2012/10/07 Javascript
解读JavaScript中 For, While与递归的用法
2013/05/07 Javascript
Javascript中判断对象是否为空
2015/06/10 Javascript
百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
2016/02/19 Javascript
深入理解JQuery中的事件与动画
2016/05/18 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
用js制作淘宝放大镜效果
2020/10/28 Javascript
JS实现上传图片实时预览功能
2017/05/22 Javascript
微信公众号H5支付接口调用方法
2019/01/10 Javascript
vue中使用vue-print.js实现多页打印
2020/03/05 Javascript
JS+JQuery实现无缝连接轮播图
2020/12/30 jQuery
[48:44]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS HGT
2014/05/22 DOTA
详解在Python程序中自定义异常的方法
2015/10/16 Python
Python使用poplib模块和smtplib模块收发电子邮件的教程
2016/07/02 Python
在win和Linux系统中python命令行运行的不同
2016/07/03 Python
Python爬取网易云音乐上评论火爆的歌曲
2017/01/19 Python
Python使用xlwt模块操作Excel的方法详解
2018/03/27 Python
Python设计模式之外观模式实例详解
2019/01/17 Python
详解Python绘图Turtle库
2019/10/12 Python
python-web根据元素属性进行定位的方法
2019/12/13 Python
ManoMano英国:欧洲第一家专注于DIY和园艺市场的电商平台
2020/03/12 全球购物
公司领导推荐信
2013/11/12 职场文书
单位办理社保介绍信
2014/01/10 职场文书
会议邀请书范文
2014/02/02 职场文书
教师网络培训感言
2014/03/09 职场文书
群众路线教育实践活动实施方案
2014/10/31 职场文书
冲出亚马逊观后感
2015/06/03 职场文书
2016新教师岗前培训心得体会
2016/01/08 职场文书
扩展多台相同的Web服务器
2021/04/01 Servers
用Python提取PDF表格的方法
2021/04/11 Python