func ExampleGetFieldKind() { s := MyStruct{ FirstField: "first value", SecondField: 2, ThirdField: "third value", } var firstFieldKind reflect.Kind var secondFieldKind reflect.Kind var err error // GetFieldKind will return reflect.String firstFieldKind, err = reflections.GetFieldKind(s, "FirstField") if err != nil { log.Fatal(err) } fmt.Println(firstFieldKind) // GetFieldKind will return reflect.Int secondFieldKind, err = reflections.GetFieldKind(s, "SecondField") if err != nil { log.Fatal(err) } fmt.Println(secondFieldKind) }
// this function is for parsing single variables func printField(container interface{}, field string) error { logger.Debugf("Inspecting field =>\t\t%s\n", field) var line string // We allow fields to be passed using dot syntax, but // we have to make sure all fields are Camelized lineSplit := strings.Split(field, ".") for n, f := range lineSplit { lineSplit[n] = camelize(f) } FieldCamel := strings.Join(lineSplit, ".") f, _ := reflections.GetFieldKind(container, FieldCamel) switch f.String() { case "ptr": // we don't recurse into to gain a bit more control... this function will be rarely used and doesn't have to be perfectly parseable. case "map": line = fmt.Sprintf("{{ range $key, $val := .%v }}{{ $key }}->{{ $val }}\n{{ end }}\n", FieldCamel) case "slice": line = fmt.Sprintf("{{ range .%v }}{{ . }}\n{{ end }}\n", FieldCamel) default: line = fmt.Sprintf("{{.%v}}\n", FieldCamel) } return writeTemplate(container, line) }
// this function is more verbose and used when inspect is // set to all func printReport(container interface{}, field string) error { var line string FieldCamel := camelize(field) f, _ := reflections.GetFieldKind(container, FieldCamel) switch f.String() { case "ptr": // we don't recurse into to gain a bit more control... this function will be rarely used and doesn't have to be perfectly parseable. case "map": line = fmt.Sprintf("%-20s\n{{ range $key, $val := .%v }}%20v{{ $key }}->{{ $val }}\n{{ end }}", FieldCamel+":", FieldCamel, "") case "slice": line = fmt.Sprintf("%-20s\n{{ range .%v }}%20v{{ . }}\n{{ end }}", FieldCamel+":", FieldCamel, "") default: line = fmt.Sprintf("%-20s{{.%v}}\n", FieldCamel+":", FieldCamel) } return writeTemplate(container, line) }