解决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 空map和未初始化map的注意事项说明
Apr 29 Golang
解决Golang中goroutine执行速度的问题
May 02 Golang
使用golang编写一个并发工作队列
May 08 Golang
Go语言基础知识点介绍
Jul 04 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
深入理解go slice结构
Sep 15 Golang
Golang日志包的使用
Apr 20 Golang
Golang入门之计时器
May 04 Golang
Golang实现可重入锁的示例代码
May 25 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 Golang
GO中sync包自由控制并发示例详解
Aug 05 Golang
Go gorilla securecookie库的安装使用详解
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之require/include顺序 推荐
2011/01/02 PHP
PHP中可以自动分割查询字符的Parse_str函数使用示例
2014/07/25 PHP
php指定长度分割字符串str_split函数用法示例
2017/01/30 PHP
PHP获取当前日期及本周一是几月几号的方法
2017/03/28 PHP
js函数般调用正则
2008/04/08 Javascript
用jquery中插件dialog实现弹框效果实例代码
2013/11/15 Javascript
javascript中不等于的代码是什么怎么写
2013/12/29 Javascript
jQuery中extend函数的实现原理详解
2015/02/03 Javascript
纯JavaScript实现的兼容各浏览器的添加和移除事件封装
2015/03/28 Javascript
Query常用DIV操作获取和设置长度宽度的实现方法
2016/09/19 Javascript
vue省市区三联动下拉选择组件的实现
2017/04/28 Javascript
vue实现点击图片放大效果
2017/08/15 Javascript
webpack手动配置React开发环境的步骤
2018/07/02 Javascript
Node.js 深度调试方法解析
2020/07/28 Javascript
简述:我为什么选择Python而不是Matlab和R语言
2017/11/14 Python
Python3.6简单反射操作示例
2018/06/14 Python
便捷提取python导入包的属性方法
2018/10/15 Python
python版大富翁源代码分享
2018/11/19 Python
Python对象与引用的介绍
2019/01/24 Python
Python3将数据保存为txt文件的方法
2019/09/12 Python
通过python实现windows桌面截图代码实例
2020/01/17 Python
keras 指定程序在某块卡上训练实例
2020/06/22 Python
如何利用Python写个坦克大战
2020/11/18 Python
python regex库实例用法总结
2021/01/03 Python
基于 HTML5 WebGL 实现的医疗物流系统
2019/10/08 HTML / CSS
丝绸和人造花卉、植物和树木:Nearly Natural
2018/11/28 全球购物
Mountain Warehouse波兰官方网站:英国户外品牌
2019/08/29 全球购物
你所知道的集合类都有哪些?主要方法?
2012/12/31 面试题
介绍一下Linux内核的排队自旋锁
2014/01/04 面试题
优秀学生获奖感言
2014/02/15 职场文书
合作意向书格式及范文
2014/03/31 职场文书
幼儿老师求职信
2014/06/30 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
2014年效能监察工作总结
2014/11/21 职场文书
公司表扬稿范文
2015/05/05 职场文书
军事博物馆观后感
2015/06/05 职场文书