for i := 0; i < FieldValue.Len(); i++ {
addMsg, ret = Recursioner(FieldValue.Index(i), fmt.Sprintf("%s[%d]", Path, i), FieldName)
if ret != 0 {
return
}
}
case reflect.Map:
for _, key := range FieldValue.MapKeys() {
addMsg, ret = Recursioner(FieldValue.MapIndex(key), fmt.Sprintf("%s[%s]", Path,
formatAtom(key)), FieldName)
if ret != 0 {
return
}
}
case reflect.Ptr:
if FieldValue.IsNil() {
fmt.Printf("%s = nil\n", Path)
} else {
addMsg, ret = Recursioner(FieldValue.Elem(), fmt.Sprintf("(*%s)", Path), FieldName)
if ret != 0 {
return
}
}
case reflect.Interface:
if FieldValue.IsNil() {
fmt.Printf("%s = nil\n", Path)
} else {
fmt.Printf("%s.type = %s\n", Path, FieldValue.Elem().Type())
addMsg, ret = Recursioner(FieldValue.Elem(), Path+".value", FieldName)
if ret != 0 {
return
}
}
default: // basic types, channels, funcs
fmt.Printf("%s = %s\n", Path, formatAtom(FieldValue))
field_name := FieldValue.Type().Name()
if field_name == "string" {
//获取该属性的tag
fmt.Println("tag_value=", FieldName)
switch FieldName {
case "alphaandnum":
addMsg, ret = CheckAlphaAndNum(CheckAlphaAndNumLen, formatAtom(FieldValue))
if ret != 0 {
return
}
case "email":
addMsg, ret = CheckEmail(CheckEmailLen, formatAtom(FieldValue))
if ret != 0 {
return addMsg, ret
}
case "num":
addMsg, ret = CheckNum(CheckNumLen, formatAtom(FieldValue))
if ret != 0 {
return
}
}
fmt.Println()
}
}
return
}
下面这个函数,格式化数据。
func formatAtom(FieldValue reflect.Value) string {
switch FieldValue.Kind() {
case reflect.Invalid:
return "invalid"
case reflect.String:
return FieldValue.String()
case reflect.Int, reflect.Int8, reflect.Int16,
reflect.Int32, reflect.Int64:
return strconv.FormatInt(FieldValue.Int(), 10)
case reflect.Uint, reflect.Uint8, reflect.Uint16,
reflect.Uint32, reflect.Uint64, reflect.Uintptr:
return strconv.FormatUint(FieldValue.Uint(), 10)
// ...floating-point and complex cases omitted for brevity...
case reflect.Bool:
return strconv.FormatBool(FieldValue.Bool())
case reflect.Chan, reflect.Func, reflect.Ptr, reflect.Slice, reflect.Map:
return FieldValue.Type().String() + " 0x" +
strconv.FormatUint(uint64(FieldValue.Pointer()), 16)
default: // reflect.Array, reflect.Struct, reflect.Interface
return FieldValue.Type().String() + " value"
}
}
具体的字段检查函数,我贴一个就好,意思到了就行。原理也很简单,用golang自带的map(java里是hashmap,python里的dict,之前做的芯片驱动层表项管理,也是hash)。
func CheckAlphaAndNum(lenLimit int, str string) (addMsg string, ret int) {
ret = 0
var lenStr int = len(str)
if lenStr > lenLimit {
ret = -1
return
}
for i := 0; i < lenStr; i++ {
r := str[i]
if _, ok := CheckAlphaAndNumMap[r]; !ok {
ret = -1
addMsg = "字母数字组合类型字符串包含非法字符,请检查!"
return
}
}
return
}
|