首页 > 后端开发 > Golang > 正文

如何在 Go 中创建具有不同签名的函数切片?

Mary-Kate Olsen
发布: 2024-11-26 05:01:10
原创
351 人浏览过

How Can I Create a Slice of Functions with Different Signatures in Go?

创建具有不同签名的函数切片

问题

如何在 Go 中创建具有不同签名的函数切片?

上下文

Go 的类型系统是静态类型的,这意味着函数在编译时必须有固定的签名。但是,创建可以接受不同类型或数字参数的函数切片可能会很有用。

解决方案

虽然提供的代码可以正常运行,但它需要使用 switch 语句来处理每个函数签名类型。更简洁灵活的解决方案是使用反射。

下面是一个示例:

package main

import (
    "fmt"
    "reflect"
)

type Executor func(...interface{})

func main() {
    functions := []Executor{
        func(a, b int) { fmt.Println(a + b) },
        func(s string) { fmt.Println(s) },
        func() { fmt.Println("No arguments") },
    }

    for _, f := range functions {
        numIn := reflect.TypeOf(f).NumIn()
        args := make([]reflect.Value, numIn)

        for i := 0; i < numIn; i++ {
            switch reflect.TypeOf(f).In(i).Kind() {
            case reflect.Int:
                args[i] = reflect.ValueOf(12)
            case reflect.String:
                args[i] = reflect.ValueOf("Hello")
            default:
                args[i] = reflect.Value{}
            }
        }

        f.Call(args)
    }
}
登录后复制

在这个解决方案中,我们创建了一片 Executor 函数,这些函数可以接受任意数量的论据。 Reflect包用于确定每个函数期望的参数数量和类型,并生成相应的reflect.Value切片。

使用反射允许我们动态调用具有不同签名的函数,而不需要类型切换或接口{}切片。

以上是如何在 Go 中创建具有不同签名的函数切片?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板