gpt4 book ai didi

go - 映射以在 Go 中存储泛型类型函数

转载 作者:数据小太阳 更新时间:2023-10-29 03:40:47 25 4
gpt4 key购买 nike

我正在尝试使用字符串创建一个映射,并将函数作为键和值。如果所有函数都具有相同的签名,它就可以工作,但我的要求是将不同签名的函数存储在同一个映射中。这在 Go 中可能吗?

package main

import "fmt"

func main() {

functions := buildFunctions()
f := functions["isInValid"]

// f("hello")

}

func buildFunctions() map[string]func() bool {

functions := map[string]func() bool{
"isInValid": isInValid,
"isAvailable": isAvailable,
}
return functions
}

func isInValid(s string) bool {
fmt.Println("Invalid ", s)
return true
}

func isAvailable(s string, s1 string) bool {
return true
}

https://play.golang.org/p/ocwCgEpa_0G

最佳答案

Go 是一种强类型语言。所以,这是不可能的,用 python 来说是可能的。但就像 python 一样,一旦你这样做,你就失去了编译时错误检查的好处,而你的运行时错误检查必须是全面的。您可以执行以下操作:

  1. 为您的函数映射使用map[string]interface{}类型,这使您能够存储任何内容。但是您有责任在调用时正确键入断言。问题是,在大多数情况下,如果在调用函数时,您可以知道函数的类型,那么您可能一开始就不需要映射。

  2. 使用 map[string]stringmap[string]interface{} 作为参数,并返回类型所有应该进入这个 map 的功能。或者至少将所有变量参数放入此映射中。

    例如。

    map[string](func (name string, age int, other_attributes
    map[string]interface{}) (map[string]interface{}, 错误))

但同样,每个函数调用都应该提供正确的参数,并且函数内部也应该有检查,看看(使用 map 查找的非 panic 版本),如果参数提供正确,如果没有,你可以返回自定义错误,如 ErrInvalidParametersPassed。 (扮演翻译的角色)。但与第一种选择相比,你搞砸的可能性仍然较小。因为 类型断言的负担 将落在函数实现上,而不是调用者。调用方只需要获取它所需的值,无论如何它都需要知道这些值。

但是,最好的选择是以某种方式重新设计您的实际解决方案,这样就可以在不走这条路的情况下完成。正如@bereal 在评论中所建议的那样,如果可能的话,最好使用单独的映射,或者如果它们不太不同或太多,则可以使用参数的超集。如果只有几个参数,即使是 switch case 也足够干净了。当您真正确信没有其他优雅的方法时,寻找欺骗/绕过编译时检查的方法。

关于go - 映射以在 Go 中存储泛型类型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52298469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com