// 使用 NumMethod() 来遍历探测结构体的方法 for i := 0; i < t.NumMethod(); i++ { m := t.Method(i) fmt.Printf("%s :%v\n", m.Name, m.Type) } // 通过方法名来调用 // 如果方法不存在,则 panic: reflect: call of reflect.Value.Call on zero Value m := v.MethodByName("Intro") // args := make([]reflect.Valuye, 0) // 方法无参数时 // 有参数时,参数类型是 reflect.Value args := []reflect.Value{reflect.ValueOf("Beijing"), reflect.ValueOf("Xian")} m.Call(args) }
func(u User) Intro(workLoc string, studyLoc string) { fmt.Printf("My name is %s%s, age %d, working in %s and study in %s\n", u.FirstName, u.LastName, u.Age, workLoc, studyLoc) }
输出:
1 2 3 4 5 6
Field Name: FirstName Field Value: wu Tag Value: front Field Name: LastName Field Value: Yin Tag Value: back Field Name: Age Field Value: 20 Tag Value: young Intro :func(main.User, string, string) My name is wuYin, age 20, working in Beijing and study in Xian {FirstName:Frank LastName:Underwood Age:50}
如果 struct 组合嵌套了,可以使用递归来处理。
Make 系列方法
除使用 make() 来为 slice、map 和 channel 分配空间,还能用反射包中的 Make 系列方法:
1 2 3 4
funcMakeSlice(typ Type, len, capint) Value {} funcMakeMap(typ Type) Value {} funcMakeMapWithSize(typ Type, n int) Value {} funcMakeChan(typ Type, buffer int) Value {}