golang 的reflect包的常用方法

目录

[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)
}
相关推荐
2601_9491465322 分钟前
Go短信验证码API示例代码:标准库net/http的调用示范
http·golang·iphone
源代码•宸36 分钟前
Leetcode—102. 二叉树的层序遍历【中等】
经验分享·后端·算法·leetcode·职场和发展·golang·slice
想摆烂的不会研究的研究生1 小时前
Go后端场景——海量数据去重
经验分享·golang·负载均衡
源代码•宸1 小时前
Golang面试题库(Context、Channel)
后端·面试·golang·context·channel·sudog·cancelctx
Wzx1980122 小时前
go聊天室接入mysql的项目docker部署流程
mysql·docker·golang
lead520lyq2 小时前
Golang GPRC流式传输案例
服务器·开发语言·golang
只是懒得想了2 小时前
Go语言ORM深度解析:GORM、XORM与entgo实战对比及最佳实践
开发语言·数据库·后端·golang
molaifeng2 小时前
从 Stdio 到 HTTP:用 Go 打造按需加载的 SQLite MCP Server
http·golang·sqlite·mcp
源代码•宸2 小时前
Leetcode—144. 二叉树的前序遍历【简单】
经验分享·算法·leetcode·面试·职场和发展·golang·dfs
2601_949146532 小时前
Go短信验证码接口开发实践:编写一个可直接运行的发送示例
服务器·microsoft·golang