解决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 相关文章推荐
Goland使用Go Modules创建/管理项目的操作
May 06 Golang
go语言基础 seek光标位置os包的使用
May 09 Golang
再次探讨go实现无限 buffer 的 channel方法
Jun 13 Golang
Go语言应该什么情况使用指针
Jul 25 Golang
修改并编译golang源码的操作步骤
Jul 25 Golang
使用GO语言实现Mysql数据库CURD的简单示例
Aug 07 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
深入理解go slice结构
Sep 15 Golang
Go 中的空白标识符下划线
Mar 25 Golang
Go归并排序算法的实现方法
Apr 06 Golang
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
Jun 21 Golang
Go结合Gin导出Mysql数据到Excel表格
Aug 05 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 格式化数字的时候注意数字的范围
2010/04/13 PHP
mysql,mysqli,PDO的各自不同介绍
2012/09/19 PHP
php通过function_exists检测函数是否存在的方法
2015/03/18 PHP
PHP性能分析工具XHProf安装使用教程
2015/05/13 PHP
php通过获取头信息判断图片类型的方法
2015/06/26 PHP
PHP数组式访问接口ArrayAccess用法分析
2017/12/28 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
JavaScript 参考教程
2006/12/29 Javascript
获取当前网页document.url location.href区别总结
2008/05/10 Javascript
Jquery升级新版本后选择器的语法问题
2010/06/02 Javascript
JavaScript的parseInt 取整使用
2011/05/09 Javascript
JavaScript 动态加载脚本和样式的方法
2015/04/13 Javascript
jQuery获得子元素个数的方法
2015/04/14 Javascript
深入浅析JavaScript中的3DES
2016/08/24 Javascript
bootstrap中使用google prettify让代码高亮的方法
2016/10/21 Javascript
javascript ASCII和Hex互转的实现方法
2016/12/27 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
python中使用PIL制作并验证图片验证码
2018/03/15 Python
Tensorflow 实现分批量读取数据
2020/01/04 Python
Python MySQLdb 执行sql语句时的参数传递方式
2020/03/04 Python
Python中Selenium库使用教程详解
2020/07/23 Python
ghd官网:英国ghd直发器品牌
2018/05/04 全球购物
来自Ocado的宠物商店:Fetch
2018/07/10 全球购物
美国打印机墨水和碳粉购物网站:QuikShip Toner
2018/08/29 全球购物
工艺工程师工作职责
2013/11/23 职场文书
学习之星事迹材料
2014/05/17 职场文书
优秀工会工作者事迹材料
2014/06/02 职场文书
安全负责人任命书
2014/06/06 职场文书
2015年光棍节活动总结
2015/03/24 职场文书
被告代理词范文
2015/05/25 职场文书
同步小康驻村工作简报
2015/07/20 职场文书
《钢铁是怎样炼成的》高中读后感
2019/08/07 职场文书
Pytorch实现图像识别之数字识别(附详细注释)
2021/05/11 Python
JavaScript中isPrototypeOf函数
2021/11/07 Javascript
golang操作rocketmq的示例代码
2022/04/06 Golang