go反射获取变量类型、值、结构体成员、结构体方法

简介: go反射获取变量类型、值、结构体成员、结构体方法

一、反射获取值和类型

reflect.TypeOf 返回类型(reflect.Type)

reflect.ValueOf 返回值(reflect.Value)

可以从 reflect.Value 获得类型

通过kind的来判断类型

func TestTypeAndValue(t *testing.T) {
  var f int64 = 10
  //反射获取类型 获取值
  t.Log(reflect.TypeOf(f), reflect.ValueOf(f))
  //获取指的类型
  t.Log(reflect.ValueOf(f).Type())
}
 
func CheckType(v interface{}) {
  t := reflect.TypeOf(v)
  switch t.Kind() {
  case reflect.Float32, reflect.Float64:
    fmt.Println("Float")
  case reflect.Int, reflect.Int32, reflect.Int16, reflect.Int64:
    fmt.Println("Integer")
  default:
    fmt.Println("Unknown")
  }
}
func TestBaseicType(t *testing.T) {
  f1 := 3.2
  i1 := 10
  flag := true
  CheckType(f1)
  CheckType(i1)
  CheckType(flag)
}
=== RUN   TestTypeAndValue
    reflect_test.go:12: int64 10
    reflect_test.go:14: int64
--- PASS: TestTypeAndValue (0.00s)
PASS
 
=== RUN   TestBaseicType
Float
Integer
Unknown
--- PASS: TestBaseicType (0.00s)
PASS

二、反射获取结构体的成员和调用方法

按名字访问结构的成员:reflect.TypeOf(*e).FieldByName("Name")

按名字访问结构的方法:reflect.ValueOf(e).MethodByName("UpdateAge"). Call([]reflect.Value{reflect.ValueOf(1)})

type Employee struct {
  Id   string
  Name string
  Age  int
}
 
func (e *Employee) UpdateAge(newVal int) {
  e.Age = newVal
}
 
func TestInvokeByName(t *testing.T) {
  e := &Employee{"1", "Mike", 30}
  //  按名字获取成员
  t.Logf("Name:value(%[1]v),Type(%[1]T)", reflect.ValueOf(*e).FieldByName("Name"))
  //reflect.TypeOf 返回字段值/字段是否存在
  if nameField, ok := reflect.TypeOf(*e).FieldByName("Name"); !ok {
    t.Error("Failed to get 'name' field.")
  } else {
    t.Log("Tag:format", nameField.Tag.Get("format"))
  }
  //反射获取公有方法,并调用
  reflect.ValueOf(e).MethodByName("UpdateAge").
    Call([]reflect.Value{reflect.ValueOf(1)})
  t.Log("updateAge Age:", e)
}


=== RUN   TestInvokeByName
    reflect_test.go:55: Name:value(Mike),Type(reflect.Value)
    reflect_test.go:60: Tag:format 
    reflect_test.go:65: updateAge Age: &{1 Mike 1}
--- PASS: TestInvokeByName (0.00s)
PASS

相关文章
初识go变量,使用var和:=来声明变量,声明变量的三种方式
这篇文章介绍了Go语言中使用`var`和`:=`声明变量的三种不同方式,包括声明单个或多个变量、通过值确定数据类型以及在函数体内使用`:=`声明局部变量。
初识go变量,使用var和:=来声明变量,声明变量的三种方式
|
19天前
|
存储 Shell Go
Go语言结构体和元组全面解析
Go语言结构体和元组全面解析
|
1天前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
28天前
|
存储 设计模式 安全
空结构体:Go 语言中的轻量级占位符
【8月更文挑战第31天】
27 0
|
28天前
|
安全 Go
|
JSON 编译器 Go
Go-结构体类型详解(声明、初始化、结构体指针、方法、序列化等)
Go-结构体类型详解(声明、初始化、结构体指针、方法、序列化等)
182 0
Go-结构体类型详解(声明、初始化、结构体指针、方法、序列化等)
|
Go C语言
Golang结构体和指针
Golang是一门很特殊的语言,虽然它出生比较晚,但是在很多地方却和现在的编程语言有所不同。现在的编程语言要么是函数式的、要么是面向对象的,而Go语言却有指针、结构体这些概念,并解决了C语言的一些坑。
1500 0
|
1天前
|
安全 Go 数据处理
探索Go语言的并发之美:Goroutines与Channels
在Go语言的世界里,"并发"不仅仅是一个概念,它是一种生活的方式。本文将带你领略Go语言中Goroutines和Channels的魔力,它们是如何让并发编程变得既简单又高效。我们将通过一个简单的示例,展示如何使用这些工具来构建一个高性能的网络服务。
|
1天前
|
关系型数据库 Go 数据处理
高效数据迁移:使用Go语言优化ETL流程
在本文中,我们将探索Go语言在处理大规模数据迁移任务中的独特优势,以及如何通过Go语言的并发特性来优化数据提取、转换和加载(ETL)流程。不同于其他摘要,本文不仅展示了Go语言在ETL过程中的应用,还提供了实用的代码示例和性能对比分析。
|
2天前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19