package main import ( "fmt" "reflect" ) type User struct { Name string Sex string Age int secret string } func (this *User) PointerCall() { fmt.Println("*User is called ...") fmt.Printf("%v\n", this) } func (this User) Call() { fmt.Println("User is called ...") fmt.Printf("%v\n", this) } func main() { user := User{"Aaron", "male", 18, "my secrets"} GetFieldsAndMethods(user) } func GetFieldsAndMethods(input interface{}) { inputType := reflect.TypeOf(input) inputValue := reflect.ValueOf(input) fmt.Println("inputType: ", inputType.Name()) fmt.Println("inputValue: ", inputValue) numField := inputType.NumField() numMethod := inputType.NumMethod() fmt.Println("numField: ", numField) fmt.Println("numMethod: ", numMethod) // 遍历属性并打印键值 for i := 0; i < inputType.NumField(); i++ { field := inputType.Field(i) fmt.Println(field.PkgPath) // PkgPath is the package path that qualifies a lower case (unexported) // field name. It is empty for upper case (exported) field names. // See https://golang.org/ref/spec#Uniqueness_of_identifiers if field.PkgPath == "" { value := inputValue.Field(i).Interface() fmt.Printf("%s: %v = %v\n", field.Name, field.Type, value) } else { fmt.Printf("%s: %v = \n", field.Name, field.Type) } } // 遍历方法并打印 for i := 0; i < inputType.NumMethod(); i++ { m := inputType.Method(i) fmt.Printf("%s: %v\n", m.Name, m.Type) } }