MST

星途 面试题库

面试题:Go反射在动态调用函数中的应用

假设有一组函数,它们的参数和返回值类型不同。现在要求使用Go语言的反射机制,根据传入的函数名称,动态调用相应的函数,并处理不同类型的参数和返回值,描述详细的实现过程并给出关键代码片段。
28.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 实现过程描述
    • 首先,需要定义一个映射,将函数名称映射到对应的函数值。
    • 使用反射来获取传入函数名称对应的函数值。
    • 对于函数参数,根据反射获取参数的类型,将实际传入的参数值转换为函数期望的参数类型。
    • 调用函数,并通过反射处理函数的返回值。
  2. 关键代码片段
package main

import (
    "fmt"
    "reflect"
)

// 定义几个不同参数和返回值类型的函数
func add(a, b int) int {
    return a + b
}

func multiply(a, b float64) float64 {
    return a * b
}

func main() {
    // 函数名到函数值的映射
    functionMap := map[string]interface{}{
        "add":      add,
        "multiply": multiply,
    }

    functionName := "add"
    function, ok := functionMap[functionName]
    if!ok {
        fmt.Println("Function not found")
        return
    }

    // 获取函数的反射值
    funcValue := reflect.ValueOf(function)

    // 准备参数
    var args []reflect.Value
    if functionName == "add" {
        args = []reflect.Value{reflect.ValueOf(3), reflect.ValueOf(5)}
    } else if functionName == "multiply" {
        args = []reflect.Value{reflect.ValueOf(2.5), reflect.ValueOf(4.0)}
    }

    // 调用函数
    results := funcValue.Call(args)

    // 处理返回值
    for _, result := range results {
        fmt.Println("Result:", result.Interface())
    }
}