golang中reflect包的常用方法

 更新时间:2025年07月02日 15:10:21   作者:草海桐  
Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

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

相关文章

  • golang新手不注意可能会出现的一些小问题

    golang新手不注意可能会出现的一些小问题

    最近在学习golang,发现了一些新手们需要注意的小问题,下面这篇文章主要给大家介绍了关于golang新手不注意可能会出现的一些小问题,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-12-12
  • go语言睡眠排序算法实例分析

    go语言睡眠排序算法实例分析

    这篇文章主要介绍了go语言睡眠排序算法,实例分析了睡眠排序算法的原理与实现技巧,需要的朋友可以参考下
    2015-03-03
  • GoLang中的sync包Once使用执行示例

    GoLang中的sync包Once使用执行示例

    这篇文章主要介绍了GoLang中的sync包Once使用执行示例,没有学习Once前,大家可能想到 声明一个标识,表示是否初始化过,然后初始化这个标识加锁,更新这个标识,Once包主要用于在并发执行代码的时候,某部分代码只会被执行一次
    2023-03-03
  • Go REFLECT Library反射类型详解

    Go REFLECT Library反射类型详解

    这篇文章主要为大家介绍了Go REFLECT Library反射类型详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Golang实现IO操作

    Golang实现IO操作

    本文主要介绍了Golang实现IO操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • Go语言题解LeetCode1051高度检查器示例详解

    Go语言题解LeetCode1051高度检查器示例详解

    这篇文章主要为大家介绍了Go语言题解LeetCode1051高度检查器示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Go语言超时退出的三种实现方式总结

    Go语言超时退出的三种实现方式总结

    这篇文章主要为大家详细介绍了Go语言中超时退出的三种实现方式,文中的示例代码简洁易懂,对我们深入了解Go语言有一定的帮助,需要的可以了解一下
    2023-06-06
  • golang根据URL获取文件名的示例代码

    golang根据URL获取文件名的示例代码

    这篇文章主要为大家详细介绍了golang根据URL获取文件名,文中的示例代码讲解详细,对大家的学习或工作有一定的帮助,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • 一文完全掌握 Go math/rand(源码解析)

    一文完全掌握 Go math/rand(源码解析)

    这篇文章主要介绍了一文完全掌握 Go math/rand(源码解析),本文可以帮助大家快速使用Go Rand.,感兴趣的朋友跟随小编一起看看吧
    2021-04-04
  • GoFrame实现顺序性校验示例详解

    GoFrame实现顺序性校验示例详解

    这篇文章主要为大家介绍了GoFrame实现顺序性校验示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06

最新评论