实现思路
- 使用
reflect.TypeOf
获取接口值的类型信息,判断其是否为目标结构体指针类型。
- 使用
reflect.ValueOf
获取接口值的实际值,然后通过Elem
方法获取指针指向的结构体值,以便调用其方法。
- 使用
reflect.Value.MethodByName
获取结构体的PrintInfo
方法,然后通过Call
方法调用该方法。
代码示例
package main
import (
"fmt"
"reflect"
)
// 定义目标结构体
type MyStruct struct {
Message string
}
// 结构体的PrintInfo方法
func (m *MyStruct) PrintInfo() {
fmt.Println("Info:", m.Message)
}
func main() {
var i interface{}
myStruct := &MyStruct{Message: "Hello, Reflect!"}
i = myStruct
// 获取接口值的类型
valueType := reflect.TypeOf(i)
// 判断是否为MyStruct指针类型
if valueType.Kind() == reflect.Ptr && valueType.Elem().Name() == "MyStruct" {
// 获取接口值的实际值
value := reflect.ValueOf(i)
// 获取指针指向的结构体值
structValue := value.Elem()
// 获取PrintInfo方法
method := structValue.MethodByName("PrintInfo")
if method.IsValid() {
// 调用PrintInfo方法
method.Call(nil)
} else {
fmt.Println("Method PrintInfo not found")
}
} else {
fmt.Println("Type assertion failed")
}
}