gpt4 book ai didi

go - Golang 中字符串和泛型函数的映射

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

我正在尝试创建一个将字符串映射到函数的映射。并非所有函数都具有相同的签名。例如,我想要这样的东西:

rf := map[string]func(...interface{}) error{
"FirstName": validateExistence(a.FirstName, "FirstName is required."),
"Postcode": validateMatchPattern(a.Postcode, `^\d{5}$`, "Could not match pattern for postcode."),
"Address": validateLength(a.Address, 0, 35, "Address must have up to 35 chars."),
}

我收到这个错误:

cannot use validateExistence("FirstName is required.") (type func(string) error) as type func(...interface {}) error in map value

如果我将 map 声明更改为 map[string]func(f string, m string) error,则 FirstName 的错误已解决,但出现其他错误对于其他两个函数:

cannot use validateMatchPattern(a.Postcode, "^\\d{5}$", "Could not match pattern for postcode.") (type error) as type func(string) error in map value
cannot use validateLength(a.Address, 0, 35, "Address must have up to 35 chars.") (type error) as type func(string) error in map value

我知道问题出在 map 声明中,更准确地说是在 func(...interface{}) 中。这部分必须与我用作 key 的函数具有相同的签名。

所以,我的问题是:是否有任何其他方法来声明可以容纳具有不同签名的函数的映射?

最佳答案

如果我正在设计这个,我会像这样分解这个问题:

  1. 我想要一个验证器映射,每个验证器都接受一个字符串并返回一个人类可读的错误。
  2. 我希望能够将一个简单的验证器配对,该验证器返回是或否的答案以及错误消息。
  3. 我需要一组简单的验证器。

请注意,在所有这些情况下,您都需要返回函数的函数。例如,长度验证器可以是:

func validateLength(min, max int) func(string) bool {
return func(s string) bool {
return len(s) >= min && len(s) <= max
}
}

然后你可以将它包装在一个产生错误的函数中

func makeValidator(f func(string) bool, msg string) func(string) error {
return func(s string) error {
if !f(s) {
return errors.New(msg)
}
return nil
}
}

现在你有几个层来构建进入 map 的功能,所以你可以创建

rt := map[string]func(string) error {
"Address": makeValidator(
validateLength(0, 35),
"Address must have up to 35 chars."
)
}

这并没有将它与特定字段配对(事实上,评论中建议只在代码中编写它可能是一个很好的建议)但是如果你需要它真的是通用的,你可以使用 reflection查看结构的内容。

关于go - Golang 中字符串和泛型函数的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52738288/

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