Go 反射:根据参数动态调用不同结构体函数
反射是一种高级技术,它允许程序在运行时动态地查看和修改程序的结构。在Go语言中,可以使用反射来调用不同结构体函数。
下面是一个示例程序,该程序根据传递的参数来调用不同的结构体函数:
package main
import (
"fmt"
"reflect"
)
type A struct {
Name string
}
type B struct {
Age int
}
func (a A) SayHello() {
fmt.Println('Hello,', a.Name)
}
func (b B) SayAge() {
fmt.Println('My age is', b.Age)
}
func main() {
var obj interface{}
arg := "A"
switch arg {
case "A":
obj = A{"Alice"}
case "B":
obj = B{18}
}
v := reflect.ValueOf(obj)
m := v.MethodByName("SayHello")
m.Call(nil)
m = v.MethodByName("SayAge")
m.Call(nil)
}
在上面的示例代码中,我们定义了两个结构体 A 和 B,分别有两个函数 SayHello 和 SayAge。在 main 函数中,我们根据传递的参数来创建不同的结构体对象。然后使用反射获取对象的方法,并调用相应的函数。
在这个例子中,我们传递了参数 A,因此创建了一个 A 类型的结构体对象,并调用了 SayHello 函数。然后,我们使用反射获取了 SayAge 函数,并尝试调用它,但是因为我们创建的是 A 类型的对象,因此会出现 reflect: call of reflect.Value.Call on zero Value 的错误。
通过这个例子,我们可以看到,使用反射可以在运行时动态地查看和修改程序的结构,但是也需要注意类型的匹配问题。
原文地址: https://www.cveoy.top/t/topic/lqYE 著作权归作者所有。请勿转载和采集!