在反射里面,可以通过MethodByName查找对应的值是否存在对应的方法,示例如下:
type student struct {
name string
age uint8
}
func (s *student) setAge(age uint8) {
s.age = age
}
func main(){
b := &student{
name: "zhangsan",
age: 8,
}
fmt.Println("setAge方法是否存在", reflect.ValueOf(b).MethodByName("setAge").IsValid())
}
得到的结果如下:
运行结果显示不存在!!!
why?
那么我们再看看下面这个示例:
type student struct {
name string
age uint8
}
func (s *student) SetAge(age uint8) {
s.age = age
}
func main(){
b := &student{
name: "zhangsan",
age: 8,
}
fmt.Println("SetAge方法是否存在", reflect.ValueOf(b).MethodByName("SetAge").IsValid())
}
运行结果如下:
通过对比上面两个示例的代码,可以发现区别,setAge的首字母是小写,不能导出,在其他的包里面找不到该方法
SetAge的首字母是大写,该方法可以导出,所以在使用reflect包的时候,能找到该方法
总结:使用MethodByName查找方法时,要查找的方法应该是首字母大写的导出方法,否则无效