发布时间:2024-12-23 03:21:28
一个简单的例子:
type Person struct {
Name string
Age int
}
func main() {
p := Person{Name: "John", Age: 30}
v := reflect.ValueOf(p)
for i := 0; i < v.NumField(); i++ {
field := v.Field(i)
fmt.Println("Name:", field.String())
}
}
上面的代码中,我们使用反射获取了结构体`Person`的字段的值,并将其打印出来。请注意,使用反射获取字段的值前提是,我们需要使用`reflect.ValueOf`来获取结构体实例的反射值。
一个示例:
func Sum(a, b int) int {
return a + b
}
func main() {
f := reflect.ValueOf(Sum)
args := []reflect.Value{reflect.ValueOf(2), reflect.ValueOf(3)}
result := f.Call(args)[0].Int()
fmt.Println("Sum is:", result)
}
上面的代码中,我们使用反射调用了函数`Sum`并将结果打印出来。在这里,我们通过`reflect.ValueOf`获取了函数的反射值,然后使用`Call`方法来调用它。
一个实例:
type Person struct {
Name string
Age int
}
func main() {
p1 := Person{Name: "John", Age: 30}
pv := reflect.ValueOf(&p1).Elem()
pv.FieldByName("Name").SetString("Alice")
pv.FieldByName("Age").SetInt(25)
fmt.Println("Person is:", p1)
}
在上面的代码中,我们使用反射修改了结构体`Person`的属性值。通过`reflect.ValueOf`获取到结构体指针的反射值,然后使用`Elem()`方法获取到具体的结构体实例的反射值并通过`FieldByName`方法找到要修改的字段。最后,我们使用`SetString`和`SetInt`分别设置字段的字符串值和整数值。
一个示例:
type Shape interface {
Area() float64
}
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return math.Pi * c.Radius * c.Radius
}
func main() {
var s Shape = Circle{Radius: 5}
v := reflect.ValueOf(s)
areaMethod := v.MethodByName("Area")
result := areaMethod.Call([]reflect.Value{})[0].Float()
fmt.Println("Area is:", result)
}
上面的代码中,我们定义了一个`Shape`接口,并且实现了`Area`方法。通过使用反射,我们可以动态地获取到`Shape`接口中的`Area`方法,并进行调用。