<分区>
我试图抽象出以下似乎经常出现的模式,但我能想到的唯一方法是通过通用函数:
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)。