2017-09-14 23 views
-1

我在Golang中有一些特殊的類型,它代表一個帶有Validate方法的字符串。調用方法屬於結構的字段

type string128 string 

func (s *string128) Validate() error { 
    ... 
    return nil 
} 

有結構有像以下字段:

type Strings1 struct { 
    str1 string 
    str2 string128 
    str3 string128 
    ... 
    strN+1 string128 
    strN+2 string 
} 

type Strings2 struct { 
    str1 string 
    str2 string128 
    str3 string128 
    ... 
    strN+1 string128 
    strN+2 string 
} 

我想要的功能,我可以通過他們如果電場有一個驗證()函數調用它。

我做了什麼:

func validateStruct(a interface{}) error { 
    v := reflect.ValueOf(a) 
    t := reflect.TypeOf(a) 
    for i := 0; i < v.NumField(); i++ { 
     err := reflect.TypeOf(v.Field(i).Interface()).MethodByName("Validate").Call(...) 
    } 
    return nil 
} 

但它是做了很多的恐慌。

回答

0

我發現了這個問題。 reflect.TypeOf(v.Field(i).Interface()).MethodByName("Validate")只有在Validate函數沒有指針接收器的情況下才能看到該函數,所以如果我修改字符串128的驗證函數到func (s string128) Validate() error,它正在工作。

最終解決

func validateStruct(a interface{}) error { 
    v := reflect.ValueOf(a) 
    for i := 0; i < v.NumField(); i++ { 
     if _, ok := reflect.TypeOf(v.Field(i).Interface()).MethodByName("Validate"); ok { 
      err := reflect.ValueOf(v.Field(i).Interface()).MethodByName("Validate").Call([]reflect.Value{}) 
      if !err[0].IsNil() { 
       return err[0].Interface().(error) 
      } 
     } 
    } 
    return nil 
}