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)
}

相关文章
|
2月前
|
存储 Go
Golang里空结构体struct{}的介绍和使用
【2月更文挑战第10天】Golang里空结构体struct{}的介绍和使用
47 6
|
2月前
|
关系型数据库 MySQL Go
golang使用gorm操作mysql1
golang使用gorm操作mysql1
golang使用gorm操作mysql1
|
2月前
|
存储 Go 数据处理
Golang简单实现IO操作
Golang简单实现IO操作
23 1
|
2月前
|
Go
golang使用gorm操作mysql3,数据查询
golang使用gorm操作mysql3,数据查询
|
2月前
|
JSON 前端开发 Java
golang使用gorm操作mysql2
golang使用gorm操作mysql2
|
2月前
|
JSON Go 数据格式
golang学习7,glang的web的restful接口结构体传参
golang学习7,glang的web的restful接口结构体传参
|
2月前
|
JSON 监控 安全
Golang深入浅出之-Go语言中的反射(reflect):原理与实战应用
【5月更文挑战第1天】Go语言的反射允许运行时检查和修改结构,主要通过`reflect`包的`Type`和`Value`实现。然而,滥用反射可能导致代码复杂和性能下降。要安全使用,应注意避免过度使用,始终进行类型检查,并尊重封装。反射的应用包括动态接口实现、JSON序列化和元编程。理解反射原理并谨慎使用是关键,应尽量保持代码静态类型。
40 2
|
2月前
|
Go 开发者
Golang深入浅出之-Go语言结构体(struct)入门:定义与使用
【4月更文挑战第22天】Go语言中的结构体是构建复杂数据类型的关键,允许组合多种字段。本文探讨了结构体定义、使用及常见问题。结构体定义如`type Person struct { Name string; Age int; Address Address }`。问题包括未初始化字段的默认值、比较含不可比较字段的结构体以及嵌入结构体字段重名。避免方法包括初始化结构体、自定义比较逻辑和使用明确字段选择器。结构体方法、指针接收者和匿名字段嵌入提供了灵活性。理解这些问题和解决策略能提升Go语言编程的效率和代码质量。
42 1
|
2月前
|
JSON 编译器 Go
Golang深入浅出之-结构体标签(Tags):JSON序列化与反射应用
【4月更文挑战第22天】Go语言结构体标签用于添加元信息,常用于JSON序列化和ORM框架。本文聚焦JSON序列化和反射应用,讨论了如何使用`json`标签处理敏感字段、实现`omitempty`、自定义字段名和嵌套结构体。同时,通过反射访问标签信息,但应注意反射可能带来的性能问题。正确使用结构体标签能提升代码质量和安全性。
64 0
|
2月前
|
Go 索引
Golang深入浅出之-切片(Slices)入门:创建、操作与扩容机制
【4月更文挑战第20天】Go语言中的切片是动态数组,提供灵活的操作和自动扩容。本文介绍了切片的创建(通过`make()`、数组创建和切片字面量)、基本操作(索引访问、切片、赋值追加和遍历)以及扩容机制(首次和后续扩容策略)。此外,还强调了切片与底层数组的关系、切片越界问题、`append()`的使用以及理解切片的关键点,帮助提升Go编程效率和代码质量。
55 0