Golang反射通过reflect.TypeOf()和reflect.ValueOf()获取类型和值信息,利用Kind()判断基础类型,通过Elem()和CanSet()修改值,支持结构体字段访问、标签获取及方法调用,实现动态函数调用需使用MethodByName()和Call()传递参数并执行。

Golang的反射机制允许程序在运行时检查和操作变量的类型信息。
reflect
reflect
类型和值是反射的基础。
reflect.TypeOf()
reflect.ValueOf()
获取类型和值: 使用
reflect.TypeOf()
reflect.ValueOf()
package main
import (
"fmt"
"reflect"
)
func main() {
var x int = 10
typeOfX := reflect.TypeOf(x)
valueOfX := reflect.ValueOf(x)
fmt.Println("Type of x:", typeOfX) // Output: Type of x: int
fmt.Println("Value of x:", valueOfX) // Output: Value of x: 10
}Kind()方法: 确定变量的基础类型(如
int
string
struct
立即学习“go语言免费学习笔记(深入)”;
package main
import (
"fmt"
"reflect"
)
func main() {
var x int = 10
typeOfX := reflect.TypeOf(x)
fmt.Println("Kind of x:", typeOfX.Kind()) // Output: Kind of x: int
}通过反射修改值: 使用
reflect.Value.SetInt()
reflect.Value
reflect.Value.CanSet()
package main
import (
"fmt"
"reflect"
)
func main() {
var x int = 10
valueOfX := reflect.ValueOf(&x) // 获取指针的 Value
// 获取指针指向的值的 Value
element := valueOfX.Elem()
if element.CanSet() {
element.SetInt(20)
}
fmt.Println("New value of x:", x) // Output: New value of x: 20
}结构体反射: 访问结构体的字段,调用结构体的方法。
package main
import (
"fmt"
"reflect"
)
type Person struct {
Name string
Age int
}
func (p Person) SayHello() {
fmt.Println("Hello, my name is", p.Name)
}
func main() {
p := Person{Name: "Alice", Age: 30}
valueOfP := reflect.ValueOf(p)
typeOfP := reflect.TypeOf(p)
// 访问字段
nameField := valueOfP.FieldByName("Name")
fmt.Println("Name:", nameField.String()) // Output: Name: Alice
// 调用方法
method := valueOfP.MethodByName("SayHello")
method.Call(nil) // Output: Hello, my name is Alice
// 遍历结构体字段
for i := 0; i < typeOfP.NumField(); i++ {
field := typeOfP.Field(i)
fmt.Printf("Field Name: %s, Type: %s\n", field.Name, field.Type)
}
}使用
reflect.Type.Field(i).Tag
package main
import (
"fmt"
"reflect"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
userType := reflect.TypeOf(User{})
for i := 0; i < userType.NumField(); i++ {
field := userType.Field(i)
jsonTag := field.Tag.Get("json")
fmt.Printf("Field: %s, JSON Tag: %s\n", field.Name, jsonTag)
}
}CanSet()
false
reflect.Value
Elem()
reflect.Value
reflect.Value
package main
import (
"fmt"
"reflect"
)
func main() {
x := 10
valueOfX := reflect.ValueOf(&x).Elem() // 关键:获取指针指向的值的 Value
if valueOfX.CanSet() {
valueOfX.SetInt(20)
fmt.Println("New value of x:", x) // Output: New value of x: 20
} else {
fmt.Println("Cannot set value of x")
}
}通过
reflect.Value.MethodByName()
Call()
Call()
[]reflect.Value
package main
import (
"fmt"
"reflect"
)
type Calculator struct{}
func (c Calculator) Add(a, b int) int {
return a + b
}
func main() {
calc := Calculator{}
valueOfCalc := reflect.ValueOf(calc)
method := valueOfCalc.MethodByName("Add")
// 构造参数
args := []reflect.Value{reflect.ValueOf(5), reflect.ValueOf(3)}
// 调用方法
result := method.Call(args)
fmt.Println("Result:", result[0].Int()) // Output: Result: 8
}以上就是Golang反射机制怎么用 reflect包核心方法解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号