1.8.3 反射调用方法与函数

1.8.3 反射调用方法与函数 #

反射不仅可以检查和修改数据,还能动态调用方法和函数。这种能力在构建框架、插件系统和动态代理等场景中非常有用。本节将详细介绍如何使用反射来发现、检查和调用方法与函数。

方法反射基础 #

获取方法信息 #

package main

import (
    "fmt"
    "reflect"
)

type Calculator struct {
    name string
}

func (c *Calculator) Add(a, b int) int {
    return a + b
}

func (c *Calculator) Subtract(a, b int) int {
    return a - b
}

func (c *Calculator) Multiply(a, b int) int {
    return a * b
}

func (c *Calculator) Divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, fmt.Errorf("division by zero")
    }
    return a / b, nil
}

func (c *Calculator) GetName() string {
    return c.name
}

func (c *Calculator) SetName(name string) {
    c.name = name
}

func main() {
    calc := &Calculator{name: "MyCalculator"}

    t := reflect.TypeOf(calc)
    v := reflect.ValueOf(calc)

    fmt.Printf("Type: %v\n", t)
    fmt.Printf("Number of methods: %d\n", t.NumMethod())

    // 遍历所有方法
    for i := 0; i < t.NumMethod(); i++ {
        method := t.Method(i)
        fmt.Printf("\nMethod %d: %s\n", i, method.Name)
        fmt.Printf("  Type: %v\n", method.Type)
        fmt.Printf("  Input parameters: %d\n", method.Type.NumIn())
        fmt.Printf("  Output parameters: %d\n", method.Type.NumOut())

        // 打印输入参数类型
        for j := 0; j < method.Type.NumIn(); j++ {
            fmt.Printf("    In[%d]: %v\n", j, method.Type.In(j))
        }

        // 打印输出参数类型
        for j := 0; j < method.Type.NumOut(); j++ {
            fmt.Printf("    Out[%d]: %v\n", j, method.Type.Out(j))
        }
    }

    // 按名称查找方法
    if method := v.MethodByName("Add"); method.IsValid() {
        fmt.Printf("\nFound method 'Add': %v\n", method.Type())
    }

    if method := v.MethodByName("NonExistent"); !method.IsValid() {
        fmt.Println("Method 'NonExistent' not found")
    }
}

调用无参数方法 #

package main

import (
    "fmt"
    "reflect"
    "time"
)

type Service struct {
    name      string
    startTime time.Time
}

func NewService(name string) *Service {
    return &Service{
        name:      name,
        startTime: time.Now(),
    }
}

func (s *Service) Start() {
    fmt.Printf("Service '%s' started\n", s.name)
}

func (s *Service) Stop() {
    fmt.Printf("Service '%s' stopped\n", s.name)
}

func (s *Service) GetStatus() string {
    return fmt.Sprintf("Service '%s' running since %v", s.name, s.startTime.Format("15:04:05"))
}

func (s *Service) GetUptime() time.Duration {
    return time.Since(s.startTime)
}

func callMethod(obj interface{}, methodName string) ([]reflect.Value, error) {
    v := reflect.ValueOf(obj)
    method := v.MethodByName(methodName)

    if !method.IsValid() {
        return nil, fmt.Errorf("method '%s' not found", methodName)
    }

    // 检查方法是否需要参数
    methodType := method.Type()
    if methodType.NumIn() > 0 {
        return nil, fmt.Errorf("method '%s' requires parameters", methodName)
    }

    // 调用方法
    results := method.Call([]reflect.Value{})
    return results, nil
}

func main() {
    service := NewService("WebServer")

    // 调用无参数无返回值的方法
    fmt.Println("Calling Start method:")
    if _, err := callMethod(service, "Start"); err != nil {
        fmt.Printf("Error: %v\n", err)
    }

    // 调用无参数有返回值的方法
    fmt.Println("\nCalling GetStatus method:")
    if results, err := callMethod(service, "GetStatus"); err != nil {
        fmt.Printf("Error: %v\n", err)
    } else {
        for i, result := range results {
            fmt.Printf("Result %d: %v (type: %v)\n", i, result.Interface(), result.Type())
        }
    }

    // 等待一秒后获取运行时间
    time.Sleep(time.Second)
    fmt.Println("\nCalling GetUptime method:")
    if results, err := callMethod(service, "GetUptime"); err != nil {
        fmt.Printf("Error: %v\n", err)
    } else {
        uptime := results[0].Interface().(time.Duration)
        fmt.Printf("Uptime: %v\n", uptime)
    }

    // 调用不存在的方法
    fmt.Println("\nCalling non-existent method:")
    if _, err := callMethod(service, "NonExistent"); err != nil {
        fmt.Printf("Error: %v\n", err)
    }
}

带参数的方法调用 #

调用带参数的方法 #

package main

import (
    "fmt"
    "reflect"
)

type MathService struct {
    precision int
}

func (m *MathService) Add(a, b int) int {
    return a + b
}

func (m *MathService) AddFloat(a, b float64) float64 {
    return a + b
}

func (m *MathService) Concat(strs ...string) string {
    result := ""
    for _, s := range strs {
        result += s
    }
    return result
}

func (m *MathService) Calculate(operation string, a, b float64) (float64, error) {
    switch operation {
    case "add":
        return a + b, nil
    case "subtract":
        return a - b, nil
    case "multiply":
        return a * b, nil
    case "divide":
        if b == 0 {
            return 0, fmt.Errorf("division by zero")
        }
        return a / b, nil
    default:
        return 0, fmt.Errorf("unknown operation: %s", operation)
    }
}

func callMethodWithArgs(obj interface{}, methodName string, args ...interface{}) ([]reflect.Value, error) {
    v := reflect.ValueOf(obj)
    method := v.MethodByName(methodName)

    if !method.IsValid() {
        return nil, fmt.Errorf("method '%s' not found", methodName)
    }

    methodType := method.Type()

    // 检查参数数量
    expectedArgs := methodType.NumIn()
    actualArgs := len(args)

    // 处理可变参数
    if methodType.IsVariadic() {
        if actualArgs < expectedArgs-1 {
            return nil, fmt.Errorf("method '%s' expects at least %d arguments, got %d",
                methodName, expectedArgs-1, actualArgs)
        }
    } else {
        if actualArgs != expectedArgs {
            return nil, fmt.Errorf("method '%s' expects %d arguments, got %d",
                methodName, expectedArgs, actualArgs)
        }
    }

    // 准备参数
    var callArgs []reflect.Value

    if methodType.IsVariadic() {
        // 处理可变参数
        for i := 0; i < expectedArgs-1; i++ {
            arg := reflect.ValueOf(args[i])
            expectedType := methodType.In(i)

            if !arg.Type().AssignableTo(expectedType) {
                if arg.Type().ConvertibleTo(expectedType) {
                    arg = arg.Convert(expectedType)
                } else {
                    return nil, fmt.Errorf("argument %d: cannot convert %v to %v",
                        i, arg.Type(), expectedType)
                }
            }
            callArgs = append(callArgs, arg)
        }

        // 处理可变参数部分
        variadicType := methodType.In(expectedArgs - 1).Elem()
        for i := expectedArgs - 1; i < actualArgs; i++ {
            arg := reflect.ValueOf(args[i])
            if !arg.Type().AssignableTo(variadicType) {
                if arg.Type().ConvertibleTo(variadicType) {
                    arg = arg.Convert(variadicType)
                } else {
                    return nil, fmt.Errorf("variadic argument %d: cannot convert %v to %v",
                        i, arg.Type(), variadicType)
                }
            }
            callArgs = append(callArgs, arg)
        }
    } else {
        // 处理固定参数
        for i, arg := range args {
            argValue := reflect.ValueOf(arg)
            expectedType := methodType.In(i)

            if !argValue.Type().AssignableTo(expectedType) {
                if argValue.Type().ConvertibleTo(expectedType) {
                    argValue = argValue.Convert(expectedType)
                } else {
                    return nil, fmt.Errorf("argument %d: cannot convert %v to %v",
                        i, argValue.Type(), expectedType)
                }
            }
            callArgs = append(callArgs, argValue)
        }
    }

    // 调用方法
    results := method.Call(callArgs)
    return results, nil
}

func main() {
    service := &MathService{precision: 2}

    // 调用 Add 方法
    fmt.Println("Calling Add(10, 20):")
    if results, err := callMethodWithArgs(service, "Add", 10, 20); err != nil {
        fmt.Printf("Error: %v\n", err)
    } else {
        fmt.Printf("Result: %v\n", results[0].Interface())
    }

    // 调用 AddFloat 方法(带类型转换)
    fmt.Println("\nCalling AddFloat(3.14, 2.86):")
    if results, err := callMethodWithArgs(service, "AddFloat", 3.14, 2.86); err != nil {
        fmt.Printf("Error: %v\n", err)
    } else {
        fmt.Printf("Result: %v\n", results[0].Interface())
    }

    // 调用可变参数方法
    fmt.Println("\nCalling Concat(\"Hello\", \" \", \"World\", \"!\"):")
    if results, err := callMethodWithArgs(service, "Concat", "Hello", " ", "World", "!"); err != nil {
        fmt.Printf("Error: %v\n", err)
    } else {
        fmt.Printf("Result: %v\n", results[0].Interface())
    }

    // 调用返回多个值的方法
    fmt.Println("\nCalling Calculate(\"divide\", 10.0, 3.0):")
    if results, err := callMethodWithArgs(service, "Calculate", "divide", 10.0, 3.0); err != nil {
        fmt.Printf("Error: %v\n", err)
    } else {
        result := results[0].Interface().(float64)
        err := results[1].Interface()
        fmt.Printf("Result: %v, Error: %v\n", result, err)
    }

    // 调用会返回错误的方法
    fmt.Println("\nCalling Calculate(\"divide\", 10.0, 0.0):")
    if results, err := callMethodWithArgs(service, "Calculate", "divide", 10.0, 0.0); err != nil {
        fmt.Printf("Error: %v\n", err)
    } else {
        result := results[0].Interface().(float64)
        err := results[1].Interface()
        fmt.Printf("Result: %v, Error: %v\n", result, err)
    }
}

函数反射 #

调用普通函数 #

package main

import (
    "fmt"
    "reflect"
    "strings"
)

// 普通函数
func Add(a, b int) int {
    return a + b
}

func Greet(name string) string {
    return fmt.Sprintf("Hello, %s!", name)
}

func ProcessStrings(processor func(string) string, strs ...string) []string {
    var results []string
    for _, str := range strs {
        results = append(results, processor(str))
    }
    return results
}

func Divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, fmt.Errorf("division by zero")
    }
    return a / b, nil
}

func callFunction(fn interface{}, args ...interface{}) ([]reflect.Value, error) {
    fnValue := reflect.ValueOf(fn)
    fnType := fnValue.Type()

    if fnType.Kind() != reflect.Func {
        return nil, fmt.Errorf("expected function, got %v", fnType.Kind())
    }

    // 检查参数数量
    expectedArgs := fnType.NumIn()
    actualArgs := len(args)

    if fnType.IsVariadic() {
        if actualArgs < expectedArgs-1 {
            return nil, fmt.Errorf("function expects at least %d arguments, got %d",
                expectedArgs-1, actualArgs)
        }
    } else {
        if actualArgs != expectedArgs {
            return nil, fmt.Errorf("function expects %d arguments, got %d",
                expectedArgs, actualArgs)
        }
    }

    // 准备参数
    var callArgs []reflect.Value
    for i, arg := range args {
        argValue := reflect.ValueOf(arg)

        var expectedType reflect.Type
        if fnType.IsVariadic() && i >= expectedArgs-1 {
            expectedType = fnType.In(expectedArgs - 1).Elem()
        } else {
            expectedType = fnType.In(i)
        }

        if !argValue.Type().AssignableTo(expectedType) {
            if argValue.Type().ConvertibleTo(expectedType) {
                argValue = argValue.Convert(expectedType)
            } else {
                return nil, fmt.Errorf("argument %d: cannot convert %v to %v",
                    i, argValue.Type(), expectedType)
            }
        }
        callArgs = append(callArgs, argValue)
    }

    // 调用函数
    results := fnValue.Call(callArgs)
    return results, nil
}

func main() {
    // 调用 Add 函数
    fmt.Println("Calling Add(5, 3):")
    if results, err := callFunction(Add, 5, 3); err != nil {
        fmt.Printf("Error: %v\n", err)
    } else {
        fmt.Printf("Result: %v\n", results[0].Interface())
    }

    // 调用 Greet 函数
    fmt.Println("\nCalling Greet(\"Alice\"):")
    if results, err := callFunction(Greet, "Alice"); err != nil {
        fmt.Printf("Error: %v\n", err)
    } else {
        fmt.Printf("Result: %v\n", results[0].Interface())
    }

    // 调用返回多个值的函数
    fmt.Println("\nCalling Divide(10.0, 3.0):")
    if results, err := callFunction(Divide, 10.0, 3.0); err != nil {
        fmt.Printf("Error: %v\n", err)
    } else {
        result := results[0].Interface().(float64)
        err := results[1].Interface()
        fmt.Printf("Result: %v, Error: %v\n", result, err)
    }

    // 调用带函数参数的函数
    fmt.Println("\nCalling ProcessStrings with ToUpper:")
    upperFunc := strings.ToUpper
    if results, err := callFunction(ProcessStrings, upperFunc, "hello", "world"); err != nil {
        fmt.Printf("Error: %v\n", err)
    } else {
        result := results[0].Interface().([]string)
        fmt.Printf("Result: %v\n", result)
    }
}

动态方法调度器 #

构建方法调度系统 #

package main

import (
    "fmt"
    "reflect"
    "strings"
)

// MethodDispatcher 方法调度器
type MethodDispatcher struct {
    handlers map[string]reflect.Value
    objects  map[string]reflect.Value
}

// NewMethodDispatcher 创建新的方法调度器
func NewMethodDispatcher() *MethodDispatcher {
    return &MethodDispatcher{
        handlers: make(map[string]reflect.Value),
        objects:  make(map[string]reflect.Value),
    }
}

// RegisterObject 注册对象及其方法
func (md *MethodDispatcher) RegisterObject(name string, obj interface{}) {
    objValue := reflect.ValueOf(obj)
    objType := reflect.TypeOf(obj)

    md.objects[name] = objValue

    // 注册对象的所有公开方法
    for i := 0; i < objType.NumMethod(); i++ {
        method := objType.Method(i)
        methodName := fmt.Sprintf("%s.%s", name, method.Name)
        md.handlers[methodName] = objValue.Method(i)

        fmt.Printf("Registered method: %s\n", methodName)
    }
}

// RegisterFunction 注册独立函数
func (md *MethodDispatcher) RegisterFunction(name string, fn interface{}) error {
    fnValue := reflect.ValueOf(fn)
    if fnValue.Kind() != reflect.Func {
        return fmt.Errorf("expected function, got %v", fnValue.Kind())
    }

    md.handlers[name] = fnValue
    fmt.Printf("Registered function: %s\n", name)
    return nil
}

// Call 调用注册的方法或函数
func (md *MethodDispatcher) Call(name string, args ...interface{}) ([]interface{}, error) {
    handler, exists := md.handlers[name]
    if !exists {
        return nil, fmt.Errorf("handler '%s' not found", name)
    }

    handlerType := handler.Type()

    // 检查参数数量
    expectedArgs := handlerType.NumIn()
    actualArgs := len(args)

    if handlerType.IsVariadic() {
        if actualArgs < expectedArgs-1 {
            return nil, fmt.Errorf("handler '%s' expects at least %d arguments, got %d",
                name, expectedArgs-1, actualArgs)
        }
    } else {
        if actualArgs != expectedArgs {
            return nil, fmt.Errorf("handler '%s' expects %d arguments, got %d",
                name, expectedArgs, actualArgs)
        }
    }

    // 准备参数
    var callArgs []reflect.Value
    for i, arg := range args {
        argValue := reflect.ValueOf(arg)

        var expectedType reflect.Type
        if handlerType.IsVariadic() && i >= expectedArgs-1 {
            expectedType = handlerType.In(expectedArgs - 1).Elem()
        } else {
            expectedType = handlerType.In(i)
        }

        if !argValue.Type().AssignableTo(expectedType) {
            if argValue.Type().ConvertibleTo(expectedType) {
                argValue = argValue.Convert(expectedType)
            } else {
                return nil, fmt.Errorf("argument %d: cannot convert %v to %v",
                    i, argValue.Type(), expectedType)
            }
        }
        callArgs = append(callArgs, argValue)
    }

    // 调用处理器
    results := handler.Call(callArgs)

    // 转换结果
    var interfaceResults []interface{}
    for _, result := range results {
        interfaceResults = append(interfaceResults, result.Interface())
    }

    return interfaceResults, nil
}

// ListHandlers 列出所有注册的处理器
func (md *MethodDispatcher) ListHandlers() []string {
    var handlers []string
    for name := range md.handlers {
        handlers = append(handlers, name)
    }
    return handlers
}

// GetHandlerInfo 获取处理器信息
func (md *MethodDispatcher) GetHandlerInfo(name string) (string, error) {
    handler, exists := md.handlers[name]
    if !exists {
        return "", fmt.Errorf("handler '%s' not found", name)
    }

    handlerType := handler.Type()
    var info strings.Builder

    info.WriteString(fmt.Sprintf("Handler: %s\n", name))
    info.WriteString(fmt.Sprintf("Type: %v\n", handlerType))
    info.WriteString(fmt.Sprintf("Input parameters: %d\n", handlerType.NumIn()))
    info.WriteString(fmt.Sprintf("Output parameters: %d\n", handlerType.NumOut()))
    info.WriteString(fmt.Sprintf("Is variadic: %v\n", handlerType.IsVariadic()))

    return info.String(), nil
}

// 测试用的服务类
type UserService struct {
    users map[int]string
}

func NewUserService() *UserService {
    return &UserService{
        users: make(map[int]string),
    }
}

func (us *UserService) CreateUser(id int, name string) string {
    us.users[id] = name
    return fmt.Sprintf("User %d (%s) created", id, name)
}

func (us *UserService) GetUser(id int) (string, error) {
    if name, exists := us.users[id]; exists {
        return name, nil
    }
    return "", fmt.Errorf("user %d not found", id)
}

func (us *UserService) ListUsers() []string {
    var users []string
    for id, name := range us.users {
        users = append(users, fmt.Sprintf("%d: %s", id, name))
    }
    return users
}

func (us *UserService) DeleteUser(id int) bool {
    if _, exists := us.users[id]; exists {
        delete(us.users, id)
        return true
    }
    return false
}

// 独立函数
func CalculateSum(numbers ...int) int {
    sum := 0
    for _, num := range numbers {
        sum += num
    }
    return sum
}

func FormatMessage(template string, args ...interface{}) string {
    return fmt.Sprintf(template, args...)
}

func main() {
    dispatcher := NewMethodDispatcher()

    // 注册服务对象
    userService := NewUserService()
    dispatcher.RegisterObject("userService", userService)

    // 注册独立函数
    dispatcher.RegisterFunction("sum", CalculateSum)
    dispatcher.RegisterFunction("format", FormatMessage)

    fmt.Println("\nRegistered handlers:")
    for _, handler := range dispatcher.ListHandlers() {
        fmt.Printf("  %s\n", handler)
    }

    fmt.Println("\n" + strings.Repeat("=", 50))

    // 测试方法调用
    testCalls := []struct {
        name string
        args []interface{}
    }{
        {"userService.CreateUser", []interface{}{1, "Alice"}},
        {"userService.CreateUser", []interface{}{2, "Bob"}},
        {"userService.GetUser", []interface{}{1}},
        {"userService.ListUsers", []interface{}{}},
        {"userService.DeleteUser", []interface{}{2}},
        {"userService.ListUsers", []interface{}{}},
        {"sum", []interface{}{1, 2, 3, 4, 5}},
        {"format", []interface{}{"Hello %s, you have %d messages", "Alice", 5}},
    }

    for _, test := range testCalls {
        fmt.Printf("\nCalling %s with args %v:\n", test.name, test.args)

        if results, err := dispatcher.Call(test.name, test.args...); err != nil {
            fmt.Printf("  Error: %v\n", err)
        } else {
            fmt.Printf("  Results: %v\n", results)
        }
    }

    // 获取处理器信息
    fmt.Println("\n" + strings.Repeat("=", 50))
    fmt.Println("\nHandler info for 'userService.CreateUser':")
    if info, err := dispatcher.GetHandlerInfo("userService.CreateUser"); err != nil {
        fmt.Printf("Error: %v\n", err)
    } else {
        fmt.Print(info)
    }
}

反射性能优化 #

方法缓存和优化 #

package main

import (
    "fmt"
    "reflect"
    "sync"
    "time"
)

// MethodCache 方法缓存
type MethodCache struct {
    cache sync.Map // map[string]reflect.Value
}

// NewMethodCache 创建方法缓存
func NewMethodCache() *MethodCache {
    return &MethodCache{}
}

// GetMethod 获取缓存的方法
func (mc *MethodCache) GetMethod(obj interface{}, methodName string) (reflect.Value, bool) {
    objType := reflect.TypeOf(obj)
    key := fmt.Sprintf("%s.%s", objType.String(), methodName)

    if cached, ok := mc.cache.Load(key); ok {
        return cached.(reflect.Value), true
    }

    // 查找方法
    objValue := reflect.ValueOf(obj)
    method := objValue.MethodByName(methodName)

    if method.IsValid() {
        mc.cache.Store(key, method)
        return method, true
    }

    return reflect.Value{}, false
}

// OptimizedCaller 优化的调用器
type OptimizedCaller struct {
    methodCache *MethodCache
}

// NewOptimizedCaller 创建优化的调用器
func NewOptimizedCaller() *OptimizedCaller {
    return &OptimizedCaller{
        methodCache: NewMethodCache(),
    }
}

// Call 优化的方法调用
func (oc *OptimizedCaller) Call(obj interface{}, methodName string, args ...interface{}) ([]interface{}, error) {
    method, found := oc.methodCache.GetMethod(obj, methodName)
    if !found {
        return nil, fmt.Errorf("method '%s' not found", methodName)
    }

    // 准备参数(简化版本,实际应用中需要更完整的类型检查)
    var callArgs []reflect.Value
    for _, arg := range args {
        callArgs = append(callArgs, reflect.ValueOf(arg))
    }

    // 调用方法
    results := method.Call(callArgs)

    // 转换结果
    var interfaceResults []interface{}
    for _, result := range results {
        interfaceResults = append(interfaceResults, result.Interface())
    }

    return interfaceResults, nil
}

// 测试用的计算器
type FastCalculator struct{}

func (fc *FastCalculator) Add(a, b int) int {
    return a + b
}

func (fc *FastCalculator) Multiply(a, b int) int {
    return a * b
}

// 基准测试
func benchmarkDirectCall(n int) time.Duration {
    calc := &FastCalculator{}
    start := time.Now()

    for i := 0; i < n; i++ {
        calc.Add(i, i+1)
    }

    return time.Since(start)
}

func benchmarkReflectCall(n int) time.Duration {
    calc := &FastCalculator{}
    start := time.Now()

    for i := 0; i < n; i++ {
        v := reflect.ValueOf(calc)
        method := v.MethodByName("Add")
        args := []reflect.Value{reflect.ValueOf(i), reflect.ValueOf(i + 1)}
        method.Call(args)
    }

    return time.Since(start)
}

func benchmarkOptimizedCall(n int) time.Duration {
    calc := &FastCalculator{}
    caller := NewOptimizedCaller()
    start := time.Now()

    for i := 0; i < n; i++ {
        caller.Call(calc, "Add", i, i+1)
    }

    return time.Since(start)
}

func main() {
    calc := &FastCalculator{}
    caller := NewOptimizedCaller()

    // 测试功能
    fmt.Println("Testing optimized caller:")
    if results, err := caller.Call(calc, "Add", 10, 20); err != nil {
        fmt.Printf("Error: %v\n", err)
    } else {
        fmt.Printf("10 + 20 = %v\n", results[0])
    }

    if results, err := caller.Call(calc, "Multiply", 6, 7); err != nil {
        fmt.Printf("Error: %v\n", err)
    } else {
        fmt.Printf("6 * 7 = %v\n", results[0])
    }

    // 性能测试
    n := 100000
    fmt.Printf("\nPerformance test with %d iterations:\n", n)

    directTime := benchmarkDirectCall(n)
    reflectTime := benchmarkReflectCall(n)
    optimizedTime := benchmarkOptimizedCall(n)

    fmt.Printf("Direct call time: %v\n", directTime)
    fmt.Printf("Reflect call time: %v\n", reflectTime)
    fmt.Printf("Optimized call time: %v\n", optimizedTime)

    fmt.Printf("\nPerformance ratios:\n")
    fmt.Printf("Reflect vs Direct: %.2fx slower\n", float64(reflectTime)/float64(directTime))
    fmt.Printf("Optimized vs Direct: %.2fx slower\n", float64(optimizedTime)/float64(directTime))
    fmt.Printf("Optimized vs Reflect: %.2fx faster\n", float64(reflectTime)/float64(optimizedTime))
}

通过本节的学习,您已经掌握了如何使用反射来动态调用方法和函数。这些技术在构建框架、插件系统、RPC 系统等场景中非常有用。在下一节中,我们将学习元编程和代码生成技术,这是反射应用的更高级形式。