是否可以在 Golang 中创建类型通用(模板)函数

IT小君   2022-11-10T23:56:41

我是新手——只是在玩它——但我写了一个命令行工具——我调用了大约 30 个不同的函数return x, err在每种情况下-我想做的只是在出现错误时惊慌失措-基本上一切正常,或者整个事情都失败了。

我知道有template.Must( t Template*, err Error) Template*——而且我知道我可以做一个check(something interface{}, err Error) interface{}——但要使用它,我必须做一个类型转换,这很讨厌。

是否可以以任何方式制作一种通用功能panicIfError,以便我可以做类似的事情

 x := panicIfError( ioutil.ReadFile( fileName )) 

x 有正确的类型吗?

(我见过很多人把 if 放在同一行 - 在我看来这牺牲了太多的可读性 - 目前我唯一的解决方案是为panicIfError我使用的每一种类型进行重载,这并不理想)

点击广告,支持我们为你提供更好的服务
评论(1)
IT小君

编辑: Go 1.18 添加了泛型,Must()可以创建一个泛型函数:

func Must[T any](v T, err error) T {
    if err != nil {
        panic(err)
    }
    return v
}

这在github.com/icza/gog, as中可用gog.Must()(披露:我是作者)。

原始答案如下。


您能做的最好的事情就是声明它返回一个 type 的值interface{},但这不是您要寻找的(您需要类型断言才能从中获取其他类型的值)。

您希望您的panicIfError()函数返回不同的具体类型。这在 Go 中是不可能的。

请参阅常见问题解答中的相关主题:为什么 Go 没有泛型类型?

2022-11-10T23:56:41   回复