>

양식을 파싱하고 여러 함수 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에서 가능합니까? 이것을 어떻게/관용적으로 수행 할 수 있습니까?


  • 답변 # 1

    네프;Go에는 사용자 정의 함수에 대한 파라 메트릭 다형성이 없으므로 그렇게 할 수 없습니다. 당신이 할 수있는 것은 interface{} 를 가지고 돌아 오는 것입니다  호출 사이트에서 유형 명제를 추가하십시오.

    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")),
    }
    
    

관련 자료

  • 이전 jquery - 반응 시이 커서 효과를 얻으려고합니다
  • 다음 html - 겹치는 버튼의 "클릭 순서"를 어떻게 변경합니까?