我希望将用户输入与功能联系起来.用户输入为字符串.例如, "func_name=MyPrintf&s1=Hello, world\!"个 或 "func_name=MyAdd&i1=1&i2=2"

每个函数的代码是,

func MyPrintf(s1 string) {
    fmt.Println(s1)
}

func MyAdd(i1, i2 int) {
    fmt.Println(i1, i2)
}

我想要一张下面这样的 map ,

type Myfunc func(string) | func(int, int)   // <- Of course, it's wrong code, just I hope like this.

myMap := make(map[string]Myfunc)

myMap["MyPrintf"] = MyPrintf
myMap["MyAdd"] = MyAdd

MyMap可以通过用户输入中的func_name字符串调用函数.

myMap[func_name](s1)个 输出:你好,世界! myMap[func_name](i1, i2) 输出:3

有可能吗? 我想也许可以用‘val’,但我听说用‘val’不好.所以,我想使用函数指针,但是Golang中没有函数指针.

我try 了一些针对Golang的泛型编程,

type Myfunc interface {
    func(string) | func(int, int)
}

myMap := make(map[string]Myfunc)

输出:出现错误:无法在类型约束之外使用类型Myfunc:接口包含类型约束

再试一次,

myMap := make(map[string]interface{})

myMap["MyPrintf"] = interface{}(MyPrintf)
myMap["MyPrintf"].(func(string))("Hello, world!")

输出:你好,世界!

myMap["MyAdd"] = interface{}(MyAdd)
myMap["MyAdd"].(func(int,int))(1, 2)

输出:3

它工作,但必须指定正确的func类型,这是不舒服.我认为这种方式不适合我的场景.请帮帮我 我为我糟糕的英语写作感到抱歉.

推荐答案

您可以try 以下操作:

我必须说,这不是一个好的做法,因为由于错误的类型导致的panic \ error不会被验证.我会考虑另一种方法.

package main

import "fmt"

type GeneralFunc func(args ...interface{})

func main() {
    // Create a map of functions with the type GeneralFunc
    functionsMap := map[string]GeneralFunc{
        "MyPrintf": func(args ...interface{}) { fmt.Println(args[0].(string)) },
        "MyAdd":    func(args ...interface{}) { fmt.Println(args[0].(int), args[1].(int)) },
    }

    // Use the functions from the map
    functionsMap["MyPrintf"]("Hello World")
    functionsMap["MyAdd"](2, 3)
}

Go相关问答推荐

从Kafka到Clickhouse的实时消费数据

如何使用Docker Compose配置Go,使main. go文件位于/CMD文件夹中

GitHub发布Golang子模块

GoLang:无法发送带有附件的邮箱

带有条件的for循环中缺少RETURN语句

GoFR HTTP服务初始化中Open遥测传输和超时配置的说明

Golang String

如何配置vscode以在Go中显示不必要的(过度指定的)泛型?

重新赋值变量时未清除动态类型-这是错误吗?

Go:拆分一个由逗号分隔的键/值对字符串,并在给定的键/价值对中嵌入可能的逗号

`docker system df` 与 `/system/df` (docker api 端点)

如何测试 Zerolog 记录器引发类型错误的日志(log)事件?

使用反射在Go中递归迭代 struct 体和集合字段

Global Thread-local Storage 在 Go 中的可行性和最佳实践

正确的 shell 程序进入 golang alpine docker 容器的入口点?

当客户端同时是服务器时,需要什么 mTLS 证书?

如何使用 GolangCI 删除未使用的导入

如何使用名称具有包名称的嵌套 struct 启动 go struct

泛型:实现嵌套接口

gopls 为 github.com/Shopify/sarama 返回错误gopls: no packages returned: packages.Load error