解决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判断key是否在map中的代码
Apr 24 Golang
goland 清除所有的默认设置操作
Apr 28 Golang
关于golang高并发的实现与注意事项说明
May 08 Golang
golang 实现并发求和
May 08 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
手把手教你导入Go语言第三方库
Aug 04 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
golang使用map实现去除重复数组
Apr 14 Golang
GO语言异常处理分析 err接口及defer延迟
Apr 14 Golang
Golang Elasticsearches 批量修改查询及发送MQ
Apr 19 Golang
实现GO语言对数组切片去重
Apr 20 Golang
详解Go语言中Get/Post请求测试
Jun 01 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和MySQL保存和输出图片
2006/10/09 PHP
PHP 字符截取 解决中文的截取问题,不用mb系列
2009/09/29 PHP
PHP抓取、分析国内视频网站的视频信息工具类
2014/04/02 PHP
php实现水仙花数示例分享
2014/04/03 PHP
一个简单安全的PHP验证码类 附调用方法
2016/06/24 PHP
PHP设计模式之PHP迭代器模式讲解
2019/03/22 PHP
PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析
2019/12/11 PHP
jQuery 事件队列调整方法
2009/09/18 Javascript
基于jQuery的前端数据通用验证库
2011/08/08 Javascript
页面使用密码保护代码
2013/04/10 Javascript
用示例说明filter()与find()的用法以及children()与find()的区别分析
2013/04/26 Javascript
JS批量操作CSS属性详细解析
2013/12/16 Javascript
JavaScript对象的property属性详解
2014/04/01 Javascript
JavaScript中的Primitive对象封装介绍
2014/12/31 Javascript
JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
2016/11/10 Javascript
详解Vue2.X的路由管理记录之 钩子函数(切割流水线)
2017/05/02 Javascript
理解Angular的providers给Http添加默认headers
2017/07/04 Javascript
在vue中使用G2图表的示例代码
2019/03/19 Javascript
Python函数式编程指南(一):函数式编程概述
2015/06/24 Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
2017/05/23 Python
python3中使用__slots__限定实例属性操作分析
2020/02/14 Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
2020/07/06 Python
美国著名的女性内衣零售商:Frederick’s of Hollywood
2018/02/24 全球购物
Jacques Lemans德国:奥地利钟表品牌
2019/12/26 全球购物
梅西百货官网:Macy’s
2020/08/04 全球购物
工程力学专业毕业生求职信
2013/10/06 职场文书
房屋租赁协议书
2014/04/10 职场文书
中文专业毕业生自荐信
2014/05/24 职场文书
售后客服个人自我评价
2014/09/14 职场文书
地球一小时活动总结
2015/02/27 职场文书
旗帜观后感
2015/06/08 职场文书
承诺书的内容有哪些,怎么写?
2019/06/21 职场文书
CSS3鼠标悬浮过渡缩放效果
2021/04/17 HTML / CSS
Win10系统下配置Java环境变量
2021/06/13 Java/Android
Element-ui Layout布局(Row和Col组件)的实现
2021/12/06 Vue.js
解决ubuntu安装软件时,status-code=409报错的问题
2022/12/24 Servers