目录
[reflect 包方法总结](#reflect 包方法总结)
[类型 (Type) 方法](#类型 (Type) 方法)
[值 (Value) 方法](#值 (Value) 方法)
reflect
包方法总结
p := Person{Name: "小明", Age: 22}
t := reflect.TypeOf(&p)
v := reflect.ValueOf(p)
类型 (Type
) 方法
方法名 | 描述 | 示例 |
---|---|---|
Name() |
获取类型的名称 | t.Name() |
Kind() |
获取类型的种类(如 struct , int , string 等) |
t.Kind() |
String() |
返回类型的完整名称,包括包路径 | t.String() |
值 (Value
) 方法
方法名 | 描述 | 示例 |
---|---|---|
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)
}