解决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语言中的UTF-8实现
Apr 26 Golang
Golang 实现超大文件读取的两种方法
Apr 27 Golang
Go语言中break label与goto label的区别
Apr 28 Golang
Golang 编译成DLL文件的操作
May 06 Golang
Golang 实现获取当前函数名称和文件行号等操作
May 08 Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 Golang
入门学习Go的基本语法
Jul 07 Golang
如何利用golang运用mysql数据库
Mar 13 Golang
Go并发4种方法简明讲解
Apr 06 Golang
Go语言安装并操作redis的go-redis库
Apr 14 Golang
Golang 对es的操作实例
Apr 20 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开发者的10个技巧
2011/02/25 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
2015/03/03 PHP
PHP封装的简单连接MongoDB类示例
2019/02/13 PHP
Javascript学习笔记4 Eval函数
2010/01/11 Javascript
在js(jquery)中获得文本框焦点和失去焦点的方法
2012/12/04 Javascript
如何使用jQuery来处理图片坏链具体实现步骤
2013/05/02 Javascript
通过正则表达式实现表单验证是否为中文
2014/02/18 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
基于jquery步骤进度条源码分享
2015/11/12 Javascript
javascript时间戳和日期字符串相互转换代码(超简单)
2016/06/22 Javascript
js数组操作方法总结(必看篇)
2016/11/22 Javascript
微信小程序 闭包写法详细介绍
2016/12/14 Javascript
bootstrap 通过加减按钮实现输入框组功能
2017/11/15 Javascript
jQuery ajax仿Google自动提示SearchSuggess功能示例
2019/03/28 jQuery
深入理解JS异步编程-Promise
2019/06/03 Javascript
JavaScript常用内置对象用法分析
2019/07/09 Javascript
在LayUI图片上传中,解决由跨域问题引起的请求接口错误的方法
2019/09/24 Javascript
[01:05:24]Ti4 冒泡赛第二天 iG vs NEWBEE 3
2014/07/15 DOTA
Python的Django框架中消息通知的计数器实现教程
2016/06/13 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
2018/06/27 Python
flask-restful使用总结
2018/12/04 Python
python如何实现异步调用函数执行
2019/07/08 Python
Django使用模板后无法找到静态资源文件问题解决
2019/07/19 Python
Python爬虫入门有哪些基础知识点
2020/06/02 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
日本最大的药妆连锁店:Matsukiyo松本清药妆店
2017/11/23 全球购物
香奈儿美国官网:CHANEL美国
2020/05/20 全球购物
餐饮部总监岗位职责范文
2014/02/13 职场文书
户外活动策划方案
2014/03/12 职场文书
应聘护士求职信
2014/07/21 职场文书
项目合作意向书模板
2014/07/29 职场文书
学风建设演讲稿
2014/09/12 职场文书
小学生自我评价100字(15篇)
2014/09/18 职场文书
亚布力滑雪场导游词
2015/02/09 职场文书
劳资员岗位职责
2015/02/13 职场文书
数据结构课程设计心得体会
2016/01/15 职场文书