在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")),
}
嗨,选民们,我怎样才能改进这个问题?