golang struct的使用
Go struct tag深入理解
喜欢本站的朋友可以收藏本站,或者加入QQ群:172816590
,我们大家一起来交流技术!
欢迎来到梁钟霖个人博客网站。本个人博客网站提供最新的站长新闻,各种互联网资讯。 还提供个人博客模板,最新最全的java教程,java面试题。在此我将尽我最大所能将此个人博客网站做的最好! 谢谢大家,愿大家一起进步!
Go的struct声明允许字段附带Tag来对字段做一些标记。
该Tag不仅仅是一个字符串那么简单,因为其主要用于反射场景,reflect包中提供了操作Tag的方法,所以Tag写法也要遵循一定的规则。
Tag的构成
Tag本身是一个字符串,但字符串中却是:以空格分隔的 key:value 对。
key: 必须是非空字符串,字符串不能包含控制字符、空格、引号、冒号。value: 以双引号标记的字符串- 注意:冒号前后不能有空格
如下代码所示,如此写没有实际意义,仅用于说明Tag规则
type Server struct {
ServerName string `key1: "value1" key11:"value11"`
ServerIP string `key2: "value2"`
}
上述代码ServerName字段的Tag包含两个key-value对。ServerIP字段的Tag只包含一个key-value对。
Struct类型表示
前面说过,Tag只有在反射场景中才有用,而反射包中提供了操作Tag的方法。在说方法前,有必要先了解一下Go是如何管理struct字段的。
以下是reflect包中的类型声明,省略了部分与本文无关的字段。
// A StructField describes a single field in a struct.
type StructField struct {
// Name is the field name.
Name string
...
Type Type // field type
Tag StructTag // field tag string
...
}
type StructTag string
可见,描述一个结构体成员的结构中包含了StructTag,而其本身是一个string。也就是说Tag其实是结构体字段的一个组成部分。
使用反射获取Tag
StructTag提供了Get(key string) string方法来获取Tag,示例如下:
package main
import (
"reflect"
"fmt"
)
type Server struct {
ServerName string `key1:"value1" key11:"value11"`
ServerIP string `key2:"value2"`
}
func main() {
s := Server{}
st := reflect.TypeOf(s)
field1 := st.Field(0)
fmt.Printf("key1:%v\n", field1.Tag.Get("key1"))
fmt.Printf("key11:%v\n", field1.Tag.Get("key11"))
filed2 := st.Field(1)
fmt.Printf("key2:%v\n", filed2.Tag.Get("key2"))
}
程序输出如下:
key1:value1
key11:value11
key2:value2
Tag存在的意义
本文示例中tag没有任何实际意义,为了阐述tag的定义与操作方法,也为了避免与你之前见过的诸如json:xxx混淆。
使用反射可以动态的给结构体成员赋值,正是因为有tag,在赋值前可以使用tag来决定赋值的动作。 比如,官方的encoding/json包,可以将一个JSON数据Unmarshal进一个结构体,此过程中就使用了Tag. 该包定义一些规则,只要参考该规则设置tag就可以将不同的JSON数据转换成结构体。
总之:正是基于struct的tag特性,才有了诸如json、orm等等的应用。理解这个关系是至关重要的。或许,你可以定义另一种tag规则,还处理你特有的数据。
Tag常见用法
常见的tag用法,主要是JSON数据解析、ORM映射。 后面再单独介绍。
转载至链接:https://my.oschina.net/renhc/blog/2045683。
golang struct的使用的更多相关文章
- Golang Struct 声明和使用
Golang Struct 声明和使用 Go可以声明自定义的数据类型,组合一个或多个类型,可以包含内置类型和用户自定义的类型,可以像内置类型一样使用struct类型 Struct 声明 具体的语法 t ...
- golang struct扩展函数参数命名警告
今天在使用VSCode编写golang代码时,定义一个struct,扩展几个方法,如下: package storage import ( "fmt" "github.c ...
- golang struct
ex1 /* https://golangbot.com/structs/ struct 结构 结构就是一组字段. */ package main import "fmt" // ...
- golang struct tag
golang可以在struct中的每个字段,写上一个tag.这个tag可以通过反射的机制获取到,最常用的场景就是json序列化和反序列化 package main import ( "enc ...
- [Golang] struct Tag说明
在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有小米点括起来的内容.形如 type User struct { UserId int `json:"use ...
- golang struct组合,转型问题请教
type Action interface { OnHurt2(other Action) GetDamage() int } type Base struct { atk, hp int } fun ...
- golang struct 转map 及 map[string]*Struct 初始化和遍历
package main import ( "encoding/json" "errors" "fmt" "reflect&quo ...
- 【GoLang】GoLang struct 使用
代码示例: package main import "fmt" type Human struct { name string age int weight int } type ...
- Golang struct结构
结构struct Go中的struct与C中的struct非常相似,并且Go没有class,代替了class的位置,但并没有代替class的功能 使用type struct{} 定义结构,名称遵循可见 ...
- golang struct 和 byte互转
相比于encoding, 使用unsafe性能更高 type MyStruct struct { A int B int } var sizeOfMyStruct = int(unsafe.Sizeo ...
随机推荐
- 如何运行spring boot 工程
1.右键工程,Run As, Maven install, 2.右键工程,Run As,Spring Boot App 3.在地址栏输入127.0.0.1:8080 动图示例
- IDEA下tomcat启动后 server乱码,Tomcat Catalina Log乱码问题的解决
如果你初接触Idea,一定会遇到控制台乱码的问题,这里和eclipse有点不一样,看如下办法: 乱码的根本原因:Windows系统的cmd是GBK编码的,所以IDEA的下方log输出的部分的编码也是G ...
- 如何配置虚拟机的ip地址以及如何使用XShell和WinSCP工具
参考资料:https://blog.csdn.net/phy1997/article/details/78928796
- Python 解LeetCode:33. Search in Rotated Sorted Array
题目描述:在一个旋转数组中查找给定的值,其中旋转数组中不含重复值: 思路: 第一遍二分遍历,找到数组中最小值的索引: 第二遍分别对最小值左右两边的数组进行二分查找: class Solution(ob ...
- Java学习路径
-------第一部分:基础语法-------- 1.输出语句 1.1 hello world 1.2 拼接输出.换行和不换行输出 1.3 拼接变量输出 2.输入语句: 2.1 定义变量,赋值(整数. ...
- 【Python基础】15_Python中的变量-进阶
1.引用的概念 2.可变类型和不可变类型 3.哈希
- S02_CH16 等精度频率计实验
S02_CH16 等精度频率计实验 在了解了AXI总线之后,今天我们自己动手设计一个带AXI4-Lite总线的IP,来完成频率计的实验. 频率计虽然小,但是也算五脏俱全,涉及到zynq的方方面面,比如 ...
- MyBatis Java不同方式加载文件时的路径格式问题、Mybatis中加载.properties文件
public class LoadPropTest { public static void main(String[] args) throws IOException { //一.Properti ...
- java实现4种内部排序
两种插入类排序: 直接插入排序: public static void insertSort(int[] arr, int len){ for(int i=1; i<len; i++){ int ...
- 如何爬取icourse163 中国慕课上课程信息(上),
中国大学MOOC网上有着特别完善的课程信息,我觉得这是一份可以让我们充分利用的资源 那么,接下来的问题就是我们该如何爬取这里的资源 选择其中的计算机课程进行尝试 import requests fro ...
,我们大家一起来交流技术!