在Go中传递任何类型的惯用方法(同时保持编译时类型检查?)

在Go中传递任何类型的惯用方法(同时保持编译时类型检查?),go,Go,我正在解析一个表单,并编写了许多函数func parseAndValidateX(val string)(T,err),其中T是任意类型 现在我想编写一个闭包func catchError(T,Error)T,这样我就可以执行以下操作: errors []Error func catchError(val T, err Error) T { if err != nil { //append err to errors } return val } d

我正在解析一个表单,并编写了许多函数
func parseAndValidateX(val string)(T,err)
,其中T是任意类型

现在我想编写一个闭包
func catchError(T,Error)T
,这样我就可以执行以下操作:

errors []Error

func catchError(val T, err Error) T {
    if err != nil {
        //append err to errors
    }
    return val
}


data = MyStruct {
Age = catchError(parseAndValidateAge("5")) // Age is a int
DistanceFromHome = catchError(parseAndValidatePi("3.14")) // DistanceFromHome is a float
Location = catchError(parseAndValidatePi("3.14,2.0")) //Location is a custom Struct
}

if len(errors) > 0 {
    // o, oh
}

这在围棋中可能吗?这怎么能容易地/习惯地做到呢?

不;您不能这样做,因为Go对于用户定义的函数没有参数多态性。您所能做的就是获取并返回
接口{}
并在调用站点添加类型断言

如果不使用
unsafe
包,Go中的所有内容都是类型安全的,因此您不必担心这一点。但是,类型断言将在运行时而不是编译时失败

但是,如果您愿意违反DRY,请执行以下操作:

type errorList []Error

func (l *errorList) addIfNotNil(err Error) {
    if err != nil {
        *l = append(*l, err)
    }
}

func (l *errorList) int(x int, err Error) int {
    l.addIfNotNil(err)
    return x
}

func (l *errorList) float32(x float32, err Error) float32 {
    l.addIfNotNil(err)
    return x
}

list := errorList([]Error{})
data := MyStruct{
    Age: list.int(parseAndValidateAge("5")),
    DistanceFromHome: list.float32(parseAndValidatePi("3.14")),
}

嗨,选民们,我怎样才能改进这个问题?