Golang反射---结构体的操作案例大全

简介: Golang反射---结构体的操作案例大全
package main
import (
  "fmt"
  "reflect"
)
//定义Monster结构体
type Monster struct{
  Name  string  `json:"name"`     //设置json tag
  Age   int     `json:"monster_age"`
  Score float64 `json:"score"`
  Sex   string
}
//给Monster绑定 GetSum方法
func (s Monster)GetSum(n1,n2 int)int{
  return n1+n2
}
//给Monster绑定 Set方法
func (s Monster)Set(name string,age int,score float64,sex string){
  s.Name  =   name
  s.Age   =   age
  s.Score =   score
  s.Sex   =   sex
}
//给Monster绑定 Print方法
func (s Monster)Print(){
  fmt.Println("--start---")
  fmt.Println(s)
  fmt.Println("-- end ---")
}
//reflect测试
func TestStruct(a interface{}){
  //获取reflect.Type类型 ==> 获取字段里的tag
  typ := reflect.TypeOf(a).Elem()
  fmt.Println(typ)
  //获取reflect.Value类型
  val := reflect.ValueOf(a).Elem()
  fmt.Println(val)
  //修改结构体字段里的值
  val.Field(0).SetString("红孩儿")
  fmt.Println("---------------------------------------")
  //val := reflect.Indirect(val1)
  //获取到reflect.Value.kind(类别),用作后面判断是否是结构体类别
  kd  := val.Kind()
  fmt.Println(kd)
  if kd != reflect.Struct{  //不是结构体类别
    fmt.Println("expect struct")
    return
  }
  //获取到该结构体的字段有几个
  numField := val.NumField()
  fmt.Println(numField)
  //遍历所有的字段
  for i:=0;i<numField;i++{
    //reflect.Value.Filed(i)
    fmt.Printf("Filed %d:值=%v\n",i,val.Field(i))
    //获取到tag标签的值
    tagVal := typ.Field(i).Tag.Get("json")
    if tagVal != ""{
      fmt.Printf("Filed %d:tag=%v\n",i,tagVal)
    }
  }
  fmt.Println("-----------------------------------------------")
  //获取到该结构体的方法有几个
  numMethod := val.NumMethod()
  fmt.Printf("struct has %d methods\n",numMethod)
  //方法的排序默认是按照函数名的ASCII码排序的
  val.Method(1).Call(nil)   //Print()
  //调用结构体的第1个方法
  var paramters []reflect.Value   //定义一个切片,作为Call的参数
  paramters = append(paramters,reflect.ValueOf(10))
  paramters = append(paramters,reflect.ValueOf(20))
  res := val.Method(0).Call(paramters)  //res是相应参数的返回值
  fmt.Println("res=",res[0].Int())
}
func main(){
  //创建一个 Monster实例
  var a  = &Monster{
    Name : "黄鼠狼",
    Age  : 22,
    Score : 88.5,
  }
  TestStruct(a)
}

相关文章
|
3月前
|
Go
Golang生成随机数案例实战
关于如何使用Go语言生成随机数的三个案例教程。
205 91
Golang生成随机数案例实战
|
3月前
|
Go
Golang的time.NewTimer单次定时器使用案例
这篇文章介绍了Go语言中time包的多种定时器使用案例,包括单次定时器的创建、阻塞程序运行的Sleep函数、重置和停止定时器的方法,以及After和AfterFunc函数的使用。
59 5
Golang的time.NewTimer单次定时器使用案例
|
3月前
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
77 3
Golang语言之Prometheus的日志模块使用案例
|
3月前
|
JSON Go 数据格式
Golang语言结构体链式编程与JSON序列化
这篇文章是关于Go语言中结构体链式编程与JSON序列化的教程,详细介绍了JSON格式的基本概念、结构体的序列化与反序列化、结构体标签的使用以及如何实现链式编程。
46 4
|
3月前
|
Go
Golang语言结构体(struct)面向对象编程进阶篇(封装,继承和多态)
这篇文章是关于Go语言中结构体(struct)面向对象编程进阶篇的教程,涵盖了Go语言如何实现封装、继承和多态,以及结构体内存布局的相关概念和案例。
189 4
|
3月前
|
Go
Golang语言结构体(struct)面向对象编程基础篇
这篇文章是关于Go语言中结构体(struct)面向对象编程的基础教程,详细介绍了面向对象编程在Go语言中的应用、结构体的定义与初始化、方法定义、跨包实例化结构体以及结构体方法和普通函数的区别。
40 4
|
3月前
|
Go
Golang语言基本数据类型默认值及字符串之间互相转换案例
这篇文章讲解了Golang语言中基本数据类型的默认值、类型转换的概述以及整型、浮点型、字符串之间的相互转换案例,包括如何将基本数据类型转换为字符串类型和字符串类型转换为基本数据类型,以及字符串与字节切片之间的转换。
33 2
|
3月前
|
Go
Golang语言数据类型分类及进制转换案例
这篇文章详细介绍了Go语言中数据类型的分类、进制转换的概念和实例,以及数字字面量语法,还涉及了原码、反码和补码的相关知识。
26 0
Golang语言数据类型分类及进制转换案例
|
3月前
|
Go
Golang的time.NewTicker周期性定时器使用案例
这篇文章介绍了Golang中time包的NewTicker函数如何创建周期性定时器,并通过两个示例展示了如何使用定时器以及如何停止定时器。
79 1
|
4月前
|
存储 人工智能 Go
golang 反射基本原理及用法
golang 反射基本原理及用法
35 0