golang基础-反射获取(基础数据、结构体)、操作(基本类型、结构体、指针)、反射获取Tag

2024-08-31 22:48

本文主要是介绍golang基础-反射获取(基础数据、结构体)、操作(基本类型、结构体、指针)、反射获取Tag,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        • 反射获取基本类型
        • 反射获取结构体
        • Elem反射操作基本类型
        • 反射调用结构体方法
        • Elem反射操作结构体
        • Elem反射获取tag
        • 练习例子

反射获取基本类型

反射:可以在运行时动态获取变量的相关信息
Import (“reflect”)

a. reflect.TypeOf,获取变量的类型,返回reflect.Type类型
b. reflect.ValueOf,获取变量的值,返回reflect.Value类型
c. reflect.Value.Kind,获取变量的类别,返回一个常量
d. reflect.Value.Interface(),转换成interface{}类型

    var x float64 = 3.4fmt.Println("type:", reflect.TypeOf(x))v := reflect.ValueOf(x)fmt.Println("value:", v)fmt.Println("type:", v.Type())fmt.Println("kind:", v.Kind())fmt.Println("value:", v.Float())fmt.Println(v.Interface())fmt.Printf("value is %5.2e\n", v.Interface())y := v.Interface().(float64)fmt.Println(y)

输出如下:

type: float64
value: 3.4
type: float64
kind: float64
value: 3.4
3.4
value is 3.40e+00
3.4
反射获取结构体
package mainimport ("fmt""reflect"
)type Student struct {Name  stringAge   intScore float32
}func test(b interface{}) {t := reflect.TypeOf(b)fmt.Println(t)v := reflect.ValueOf(b)fmt.Println(v)k := v.Kind()fmt.Println(k)iv := v.Interface()fmt.Println(iv)stu, ok := iv.(Student)if ok {fmt.Printf("%v %T\n", stu, stu)}
}func main() {var a Student = Student{Name:  "stu01",Age:   18,Score: 92,}test(a)
}

输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
main.Student
{stu01 18 92}
struct
{stu01 18 92}
{stu01 18 92} main.Student
PS E:\golang\go_pro\src\safly>
Elem反射操作基本类型

用来获取指针指向的变量,相当于:
var a *int;

func main() {var b int = 1b = 200testInt(&b)fmt.Println(b)
}//fv.Elem()用来获取指针指向的变量
func testInt(b interface{}) {val := reflect.ValueOf(b)val.Elem().SetInt(100)c := val.Elem().Int()fmt.Printf("get value  interface{} %d\n", c)fmt.Printf("string val:%d\n", val.Elem().Int())
}

输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
get value  interface{} 100
string val:100
100
PS E:\golang\go_pro\src\safly>
反射调用结构体方法
package mainimport ("fmt""reflect"
)type Student struct {Name  stringAge   intScore float32}func (s Student) Print(){fmt.Println(s)
}func (s Student) Set(name string,age int,score float32){s.Age = ages.Name = names.Score = score
}func TestStruct(a interface{}) {val := reflect.ValueOf(a)kd := val.Kind()fmt.Println(val,kd)if kd != reflect.Struct {fmt.Println("expect struct")return}//获取字段数量fields:= val.NumField()fmt.Printf("struct has %d field\n",fields)//获取字段的类型for i:=0;i<fields;i++{fmt.Printf("%d %v\n",i,val.Field(i).Kind())}//获取方法数量methods:=val.NumMethod()fmt.Printf("struct has %d methods\n",methods)//反射调用的Print方法var params []reflect.Valueval.Method(0).Call(params)}func main() {var a Student = Student{Name:  "stu01",Age:   18,Score: 92.8,}TestStruct(a)// fmt.Println(a)
}

输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
{stu01 18 92.8} struct
struct has 3 field
0 string
1 int
2 float32
struct has 2 methods
{stu01 18 92.8}
PS E:\golang\go_pro\src\safly>
Elem反射操作结构体
package mainimport ("fmt""reflect"
)type Student struct {Name  stringAge   intScore float32}func (s Student) Print(){fmt.Println(s)
}func (s Student) Set(name string,age int,score float32){s.Age = ages.Name = names.Score = score
}func TestStruct(a interface{}) {val := reflect.ValueOf(a)kd := val.Kind()fmt.Println(val,kd)if kd!= reflect.Ptr && val.Elem().Kind() ==  reflect.Struct {fmt.Println("expect struct")return}//获取字段数量fields:= val.Elem().NumField()fmt.Printf("struct has %d field\n",fields)//获取字段的类型for i:=0;i<fields;i++{fmt.Printf("%d %v\n",i,val.Elem().Field(i).Kind())}//获取方法数量methods:=val.NumMethod()fmt.Printf("struct has %d methods\n",methods)//反射调用的Print方法var params []reflect.Valueval.Elem().Method(0).Call(params)
}func main() {var a Student = Student{Name:  "stu01",Age:   18,Score: 92.8,}TestStruct(&a)// fmt.Println(a)
}

输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
&{stu01 18 92.8} ptr
struct has 3 field
0 string
1 int
2 float32
struct has 2 methods
{stu01 18 92.8}
PS E:\golang\go_pro\src\safly>
Elem反射获取tag
package mainimport ("fmt""reflect"
)type Student struct {Name  string `json:"stu_name"`Age   intScore float32}func (s Student) Print(){fmt.Println(s)
}func (s Student) Set(name string,age int,score float32){s.Age = ages.Name = names.Score = score
}func TestStruct(a interface{}) {typ := reflect.TypeOf(a)tag := typ.Elem().Field(0).Tag.Get("json")fmt.Printf("Tag:%s\n",tag)
}func main() {var a Student = Student{Name:  "stu01",Age:   18,Score: 92.8,}TestStruct(&a)
}

输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
Tag:stu_name
PS E:\golang\go_pro\src\safly>
练习例子
package mainimport ("fmt""reflect"
)type T struct {A intB string
}func main() {t := T{23, "skidoo"}s := reflect.ValueOf(&t).Elem()typeOfT := s.Type()for i := 0; i < s.NumField(); i++ {f := s.Field(i)fmt.Printf("%d: %s %s = %v\n", i,typeOfT.Field(i).Name, f.Type(), f.Interface())}s.Field(0).SetInt(77)s.Field(1).SetString("Sunset Strip")fmt.Println("t is now", t)
}

输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
0: A int = 23
1: B string = skidoo
t is now {77 Sunset Strip}
PS E:\golang\go_pro\src\safly>

这篇关于golang基础-反射获取(基础数据、结构体)、操作(基本类型、结构体、指针)、反射获取Tag的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125213

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Java发送SNMP至交换机获取交换机状态实现方式

《Java发送SNMP至交换机获取交换机状态实现方式》文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v... 目录交换机协议SNMP库获取交换机单路状态获取交换机多路状态总结交换机协议这里使用的交换机协议为常

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc