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

相关文章

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Java操作Word文档的全面指南

《Java操作Word文档的全面指南》在Java开发中,操作Word文档是常见的业务需求,广泛应用于合同生成、报表输出、通知发布、法律文书生成、病历模板填写等场景,本文将全面介绍Java操作Word文... 目录简介段落页头与页脚页码表格图片批注文本框目录图表简介Word编程最重要的类是org.apach

java中反射Reflection的4个作用详解

《java中反射Reflection的4个作用详解》反射Reflection是Java等编程语言中的一个重要特性,它允许程序在运行时进行自我检查和对内部成员(如字段、方法、类等)的操作,本文将详细介绍... 目录作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

golang版本升级如何实现

《golang版本升级如何实现》:本文主要介绍golang版本升级如何实现问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录golanwww.chinasem.cng版本升级linux上golang版本升级删除golang旧版本安装golang最新版本总结gola

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语