reflect.ValueOf(<pointer type>).MethodByName()
reflect.ValueOf(<non-pointer type>).FieldByName()
Why does MethodByName requires a pointer type while FieldByName not? Is there any reason about it?
2019-09-05
1
2
escray
其实之前对于 C# 和 Java 中的反射都有些概念模糊,看代码能看到,但是在项目中主动使用的很少。
反射最大的用途可能就是通过字符串或者以字符的形式来调用类型中的某一个方法,或者通过传入变量或者方法的名字访问某一个成员。
其实在 JavaScript 或者 Ruby 中也用到了反射,只是有时候用了而不自知。
对于留言中的问题,为什么 MethodByName 之前的 ValueOf 传递的参数是指针,而 FieldByName 之前 ValueOf 传递的是实例,我也不太明白,抄一段官方文档:
```
func (v Value) FieldByName(name string) Value
```
FieldByName returns the struct field with the given name. It returns the zero Value if no field was found. It panics if v's Kind is not struct.
```
func (v Value) MethodByName(name string) Value
```
MethodByName returns a function value corresponding to the method of v with the given name. The arguments to a Call on the returned function should not include a receiver; the returned function will always use v as the receiver. It returns the zero Value if no method was found.