MST

星途 面试题库

面试题:Go反射在类型断言和动态调用方法中的应用

给定一个接口类型`interface{}`,里面实际存储了一个结构体指针,该结构体有一个名为`PrintInfo`的方法。请使用反射来进行类型断言,判断接口中的值是否为该结构体指针,并动态调用`PrintInfo`方法。请详细阐述实现思路,并给出完整的代码示例。
29.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 使用reflect.TypeOf获取接口值的类型信息,判断其是否为目标结构体指针类型。
  2. 使用reflect.ValueOf获取接口值的实际值,然后通过Elem方法获取指针指向的结构体值,以便调用其方法。
  3. 使用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")
	}
}