解决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 生成对应的数据表struct定义操作
Apr 28 Golang
golang协程池模拟实现群发邮件功能
May 02 Golang
go mod 安装依赖 unkown revision问题的解决方案
May 06 Golang
使用golang编写一个并发工作队列
May 08 Golang
聊聊golang中多个defer的执行顺序
May 08 Golang
go 实现简易端口扫描的示例
May 22 Golang
深入理解go slice结构
Sep 15 Golang
Go归并排序算法的实现方法
Apr 06 Golang
Golang Elasticsearches 批量修改查询及发送MQ
Apr 19 Golang
Golang gRPC HTTP协议转换示例
Jun 16 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中的类-什么叫类
2006/11/20 PHP
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
php Ubb代码编辑器函数代码
2012/07/05 PHP
zend framework配置操作数据库实例分析
2012/12/06 PHP
PHP提示Warning:phpinfo() has been disabled函数禁用的解决方法
2014/12/17 PHP
iis 7下安装laravel 5.4环境的方法教程
2017/06/14 PHP
PHP字典树(Trie树)定义与实现方法示例
2017/10/09 PHP
PHP调用接口API封装的例子
2019/10/11 PHP
jquery根据name属性查找的小例子
2013/11/21 Javascript
了不起的node.js读书笔记之例程分析
2014/12/22 Javascript
node.js中的forEach()是同步还是异步呢
2015/01/29 Javascript
Node.js操作mysql数据库增删改查
2016/03/30 Javascript
jQuery插件uploadify实现ajax效果的图片上传
2016/06/18 Javascript
JavaScript计时器用法分析【setTimeout和clearTimeout】
2017/01/18 Javascript
微信小程序商城项目之淘宝分类入口(2)
2017/04/17 Javascript
JS实现的走迷宫小游戏完整实例
2017/07/19 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
2017/08/31 Javascript
基于模板引擎Jade的应用(详解)
2017/12/12 Javascript
小程序实现抽奖动画
2020/04/16 Javascript
Koa 中的错误处理解析
2019/04/09 Javascript
vue移动端使用appClound拉起支付宝支付的实现方法
2019/11/21 Javascript
JS中的变量作用域(console版)
2020/07/18 Javascript
微信小程序实现购物车小功能
2020/12/30 Javascript
Python合并多个装饰器小技巧
2015/04/28 Python
python实现txt文件格式转换为arff格式
2018/05/31 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
2020/07/13 Python
Python如何telnet到网络设备
2021/02/18 Python
美特斯邦威官方商城:邦购网
2016/10/13 全球购物
优秀广告词大全
2014/03/19 职场文书
副处级干部考察材料
2014/05/17 职场文书
霸气队列口号
2014/06/18 职场文书
2014国庆节国旗下演讲稿(精选版)
2014/09/26 职场文书
实习单位证明范例
2014/11/17 职场文书
2015年幼儿园班主任工作总结
2015/05/12 职场文书
2015年初中教务处工作总结
2015/07/21 职场文书
2016年元旦致辞
2015/08/01 职场文书