generics - Go中任何类型的错误处理函数

标签 generics go

<分区>

我试图抽象出以下似乎经常出现的模式,但我能想到的唯一方法是通过通用函数:

func DoStuff () MyType {
    result, err := SomeProcess()  // returns MyType
    if err != nil {
        log.Fatal(err)
    }
    return result // or do something else with it
}

这是我的解决方案:

func FailOnError(value interface{}, err error) interface{} {
    if err != nil {
        log.Fatal(err)
    }
    return value
}

func DoStuff () MyType {
    return FailOnError(SomeProcess())
}

问题是我没有编译时类型安全,如果我想对结果做任何进一步的事情,我需要明确地对其进行类型转换,例如

type MyType struct {
    value int
}

// Assuming a function with this signature
func GetItem() (MyType, error)

func Add () MyType {
    item := MyType(FailOnError(GetItem()))
}

这没问题,我想,但相当不优雅。此外,这意味着手动强制执行总是有些脆弱且可能影响性能的类型。

是否有更好或更惯用的方法来做到这一点?

编辑:因为这似乎是一个令人讨厌的问题,所以我改用下面的例子怎么样:

func Identity(x interface{}) interface{} {
    return x
}

用法需要:

x = int(Identity(1))
y = MyType(Identity(MyType{value}))

没有什么能阻止我做事

x = int(Identity(MyType{value}))

Identity 是故意的,但不一定如此。例如,我可能是设计用于执行某些日志记录或改变对象并将其返回的方法。我遇到的另一种情况是,我想对各种外部库中定义的某些类型做一些工作——它们非常相似,我可以编写一个函数来处理所有这些类型,但它们不共享一个接口(interface)。

最佳答案

Is there a better, or more idiomatic way of doing this?

是:处理错误。 Log.Fatal 不是错误处理。如果致命真的是正确的事情:只封装致命。

将错误致命作为一个函数,而不是调用,请远离interface{}:

func abortOnError(err error) {
    if err == nil {return}
    log.Fatal(err)
}

func whatever() int {
    x, err := someOp()
    abortOnError(err)
    return x+2
}

关于generics - Go中任何类型的错误处理函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45476506/

相关文章:

java - 如何基于公共(public)字段使用 Jackson 抽象反序列化不同的枚举类型?

java - 获取从非泛型类型类扩展的类的泛型类型

c# - "null if object is null, or object.member if object is not null"的快捷方式

php - AWS 剥离 HTTP header ?

go - 如何人为增加CPU使用率

go - 超过 max.poll.interval.ms 后,Kafka 消费者卡住了

go - 如何动态更改golang中的类型定义?

go - Circleci 和 GoBuffalo 挑战

java - 通用类型数组的可能方法?

java - 动态调用静态方法而不使用反射