golang中reflect包的常用方法

Written by

in

文章目录
  • p := Person{Name: “小明”, Age: 22} t := reflect.TypeOf(&p) v := reflect.ValueOf(p)
  • 目录
    • reflect包方法总结
      • 类型 (Type) 方法
      • 值 (Value) 方法

      p := Person{Name: "小明", Age: 22}
      t := reflect.TypeOf(&p)
      v := reflect.ValueOf(p)

    方法名 描述 示例               
    Name() 获取类型的名称 t.Name()
    Kind() 获取类型的种类(如 struct, int, string 等) t.Kind()
    String() 返回类型的完整名称,包括包路径 t.String()

    方法名 描述 示例               
    FieldByName() 根据字段名称获取字段的值 v.FieldByName("Age")
    NumField() 获取结构体的字段数量 v.NumField()
    Field() 根据索引获取字段的值 v.Field(i)
    Interface() 获取字段的值作为 interface{} 类型 v.Field(i).Interface()
    String() 返回值的字符串表示 v.String()
    Kind() 获取值的种类(与 Type().Kind() 相同) v.Kind()
    Type() 获取值的类型信息 v.Type()
    Elem() 返回指针指向的值 reflect.ValueOf(&p).Elem()
    SetString() 设置字符串类型的值 nameField.SetString("ChenZH")
    MethodByName() 根据方法名称获取方法的值 ptr.MethodByName("String")
    Call() 调用方法,传入参数(此处为 nil) method.Call(nil)
    IsValid() 检查值是否有效 method.IsValid()
    CanSet() 检查字段是否可以设置 nameField.CanSet()

    代码示例:

    package main
    
    import (
    	"fmt"
    	"reflect"
    )
    
    type Person struct {
    	Name string
    	Age  int
    }
    
    func main() {
    	//Type:类型信息,包括基础类型(如int, string)、复合类型(如数组、切片、结构体)等。
    	//Value:实际值,可以是任何类型的值。
    	//Kind:更具体的类型分类,比如int, float64, struct等。
    
    	// 获取类型信息
    	p := Person{Name: "小明", Age: 22}
    	t := reflect.TypeOf(p)
    	fmt.Println("Type_name:", t.Name())
    	fmt.Println("Type_kind:", t.Kind())
    	fmt.Println("Type_string:", t.String())
    
    	// 获取值信息
    	v := reflect.ValueOf(p)
    	fmt.Println(v.FieldByName("Age"))
    	fmt.Println("Value:", v)
    	for i := 0; i < v.NumField(); i++ {
    		fmt.Println("Field:", i, "Value:", v.Field(i).Interface())
    	}
    	fmt.Println("Value_String", v.String())
    	fmt.Println("Value_Kind", v.Kind())
    	fmt.Println("Value_Type", v.Type())
    
    	// 修改字段值(得传递指针)
    	ptr := reflect.ValueOf(&p).Elem()
    	fmt.Println("Ptr_Value:", ptr)
    	nameField := ptr.FieldByName("Name")
    	if nameField.IsValid() && nameField.CanSet() {
    		nameField.SetString("xiaoming")
    	}
    	fmt.Println("modified name: ", p.Name)
    
    	// 调用方法
    	method := ptr.MethodByName("String")
    	if method.IsValid() {
    		results := method.Call(nil)
    		for _, result := range results {
    			fmt.Println("Method result: ", result.String())
    		}
    	}
    }
    
    func (p Person) String() string {
    	return fmt.Sprintf("%s is %d year old", p.Name, p.Age)
    }
    

    到此这篇关于golang中reflect包的常用方法的文章就介绍到这了,更多相关golang reflect包内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 

    您可能感兴趣的文章:

    • 详解Golang利用反射reflect动态调用方法
    • 一文带你了解Golang中reflect反射的常见错误
    • Golang之reflect包的使用方法详解
    • 深入了解Golang中reflect反射基本原理
    • 深入理解Golang的反射reflect示例
    • Golang反射模块reflect使用方式示例详解
    • Golang reflect反射的使用实例
    • 深入了解Golang中reflect反射的使用
    • Golang实现深拷贝reflect原理示例探究
    • golang基础之reflect反射的实现

    站内搜索