解决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语言中GOPATH GOROOT的作用和设置方式
May 05 Golang
golang gopm get -g -v 无法获取第三方库的解决方案
May 05 Golang
golang 实用库gotable的具体使用
Jul 01 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
golang使用map实现去除重复数组
Apr 14 Golang
Golang 字符串的常见操作
Apr 19 Golang
实现GO语言对数组切片去重
Apr 20 Golang
Golang 入门 之url 包
May 04 Golang
详解Go语言中配置文件使用与日志配置
Jun 01 Golang
Go 内联优化让程序员爱不释手
Jun 21 Golang
基于Python实现西西成语接龙小助手
Aug 05 Golang
Go中使用gjson来操作JSON数据的实现
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 XML操作的各种方法解析(比较详细)
2010/06/17 PHP
PHP 文本文章分页代码 按标记或长度(不涉及数据库)
2012/06/07 PHP
基于MySQL到MongoDB简易对照表的详解
2013/06/03 PHP
PHP5多态性与动态绑定介绍
2015/04/03 PHP
laravel邮件发送的实现代码示例
2020/01/31 PHP
JQUERY 对象与DOM对象之两者相互间的转换
2009/04/27 Javascript
combox改进版 页面原型参考dojo的,比网上jQuery的那些combox功能强,代码更小
2010/04/15 Javascript
juqery 学习之三 选择器 层级 基本
2010/11/25 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
模仿password输入框的实现代码
2016/06/07 Javascript
微信小程序 数据访问实例详解
2016/10/08 Javascript
单击按钮发送验证码,出现倒计时的简单实例
2017/03/17 Javascript
jQuery实现一个简单的验证码功能
2017/06/26 jQuery
使用sessionStorage解决vuex在页面刷新后数据被清除的问题
2018/04/13 Javascript
使用Jenkins部署React项目的方法步骤
2019/03/11 Javascript
微信小程序云开发之模拟后台增删改查
2019/05/16 Javascript
JavaScript实现随机点名程序
2020/03/25 Javascript
深入浅析vue全局环境变量和模式
2020/04/28 Javascript
详解React的回调渲染模式
2020/09/10 Javascript
介绍Python中的fabs()方法的使用
2015/05/14 Python
Django实现的自定义访问日志模块示例
2017/06/23 Python
Python判断有效的数独算法示例
2019/02/23 Python
python安装requests库的实例代码
2019/06/25 Python
python多线程分块读取文件
2019/08/29 Python
keras slice layer 层实现方式
2020/06/11 Python
python实现银行账户系统
2021/02/22 Python
如何避免常见的6种HTML5错误用法
2017/11/06 HTML / CSS
中粮集团旗下食品网上购物网站:我买网
2016/09/22 全球购物
软件工程师岗位职责
2013/11/16 职场文书
计算机软件专业求职信
2014/06/10 职场文书
2014年残联工作总结
2014/11/21 职场文书
2014年内部审计工作总结
2014/12/09 职场文书
陕西导游词
2015/02/04 职场文书
2015年党员个人自我评价
2015/03/03 职场文书
Nginx快速入门教程
2021/03/31 Servers
Python如何用re模块实现简易tokenizer
2022/05/02 Python