go - 是否有可能在 Golang 中制作类型泛型(模板)函数

标签 go generics

我是新手 - 只是玩玩它 - 但我已经编写了一个命令行工具 - 我调用了大约 30 个不同的函数,它们 return x, err。在任何情况下 - 我想做的只是在出现错误时 panic - 基本上一切正常,否则整个事情都会失败。

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

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

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

并且 x 有正确的类型吗?

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

最佳答案

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

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

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

原始答案如下。


您能做的最好的事情就是将其声明为返回 interface{} 类型的值,但这不是您要查找的值(您需要 type assertion 来获取其他类型的值从中输入)。

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

请参阅 FAQ: Why does Go not have generic types? 中的相关主题

关于go - 是否有可能在 Golang 中制作类型泛型(模板)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38690544/

相关文章:

go - 在 Go 测试包中模拟 statsd 客户端

go - 没有输出到错误文件

Java:数据结构和通配符的泛型

c# - 将 '==' 运算符应用于泛型参数

C# 泛型——基于类型特征的重载

loops - slice 范围的循环索引

go - golang检查udp端口打开

java - 验证期间使用泛型

java - 对通用数据结构数组进行排序

go - 我如何处理 goroutine 中的 panic ?