2017-02-03 1 views
0

struct을 취하는 제네릭 함수를 작성하려고하는데 주어진 필드의 값이 0이 아닌지 확인합니다.Go에서 구조 필드가 0이 아닌 것을 확인하십시오.

이 제 기능입니다 :

func CheckRequiredFields(kind string, i interface{}, fields ...string) error { 
    for _, field := range fields { 
     value := reflect.ValueOf(i).FieldByName(field) 
     if value.Interface() == reflect.Zero(value.Type()).Interface() { 
      return fmt.Errorf("missing required %s field %s", kind, field) 
     } 
    } 
    return nil 
} 

structi로 전달되는 경우 그것은 잘 작동하지만, istruct에 대한 포인터 인 경우 실패합니다.

전달 된 값이 포인터 인 경우 인터페이스의 값을 어떻게 반영 할 수 있습니까?

답변

1

reflect.Indirect을 사용하면 v가 가리키는 값을 반환 할 수 있습니다. v가 nil 포인터이면 Indirect는 0 값을 반환합니다. v가 포인터가 아닌 경우 Indirect는 v를 반환합니다.

값이 포인터인지 확인하려면 Kind을 확인하고 Elem()을 사용하여 포인터를 역 참조하십시오.

v := reflect.ValueOf(i) 
if v.Kind() == reflect.Ptr { 
    v = v.Elem() 
} 
+0

감사합니다. – Ralph

관련 문제