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

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

如何利用Java获取当天的开始和结束时间

《如何利用Java获取当天的开始和结束时间》:本文主要介绍如何使用Java8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处... 目录前言1. Java日期时间API概述2. 获取当天的开始和结束时间代码解析运行结果3. 总结前言在J

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多