解决golang结构体tag编译错误的问题

 更新时间:2021年05月01日 14:24:03   作者:songzhaorong  
这篇文章主要介绍了解决golang结构体tag编译错误的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

写了一个带标签的结构体

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
}
  

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

您可能感兴趣的文章:

相关文章

  • 利用 Go 语言编写一个简单的 WebSocket 推送服务

    利用 Go 语言编写一个简单的 WebSocket 推送服务

    这篇文章主要介绍了利用 Go 语言编写一个简单的 WebSocket 推送服务,需要的朋友可以参考下
    2018-04-04
  • golang字符串转64位整数的示例代码

    golang字符串转64位整数的示例代码

    这篇文章主要介绍了golang字符串转64位整数,在Go语言中,可以使用strconv包中的ParseInt函数将字符串转换为64位整数,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • Golang如何编写内存高效及CPU调优的Go结构体

    Golang如何编写内存高效及CPU调优的Go结构体

    这篇文章主要介绍了Golang如何编写内存高效及CPU调优的Go结构体,结构体是包含多个字段的集合类型,用于将数据组合为记录
    2022-07-07
  • 简单聊聊Go语言中空结构体和空字符串的特殊之处

    简单聊聊Go语言中空结构体和空字符串的特殊之处

    在日常的编程过程中,大家应该经常能遇到各种”空“吧,比如空指针、空结构体、空字符串等,本文就以 Go 语言为例,一起来看看空结构体和空字符串在 Go 语言中的特殊之处吧
    2024-03-03
  • Golang使用embed引入静态文件的实例代码

    Golang使用embed引入静态文件的实例代码

    Golang embed是Go 1.16版本中引入的一项新功能,它可以使嵌入文件更容易,通常,在Go中嵌入文件需要使用文件系统或者第三方包,而使用embed可以更加便捷地嵌入文件,从而方便地访问文件的内容,本文介绍了Golang使用embed引入静态文件,需要的朋友可以参考下
    2024-06-06
  • Golang操作excel的技巧与方法

    Golang操作excel的技巧与方法

    在Golang中操作Excel可以包括读取、写入和编辑Excel文件,你可以定义函数或方法来执行这些操作,本文给大家介绍了Golang操作excel的技巧与方法,文中有详细的代码讲解,需要的朋友可以参考下
    2024-05-05
  • Go语言中println和fmt.Println区别

    Go语言中println和fmt.Println区别

    本文主要介绍了Go语言中println和fmt.Println区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Golang时间处理库go-carbon v2.2.13发布细则

    Golang时间处理库go-carbon v2.2.13发布细则

    这篇文章主要为大家介绍了Golang 时间处理库go-carbon v2.2.13发布细则,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • go开源项目用户名密码验证的逻辑鬼才写法

    go开源项目用户名密码验证的逻辑鬼才写法

    这篇文章主要为大家介绍了go开源项目中发现的一个逻辑鬼才写法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • go语言通过管道连接两个命令行进程的方法

    go语言通过管道连接两个命令行进程的方法

    这篇文章主要介绍了go语言通过管道连接两个命令行进程的方法,实例分析了Go语言操作命令行进程的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03

最新评论