我有以下Go代码(play.golang.org):
auto A::get_func() -> int (A::*)();
我只是很好奇。为什么在调用package main
import (
"reflect"
"fmt"
)
type User struct {
name string
email string
}
func main() {
uS := User{}
uSt := reflect.TypeOf(uS)
fmt.Println( uSt )
fmt.Println( uSt.NumField() )
// fmt.Println( uS.NumField() ) // this doesn't work, why?
}
之前需要首先获取结构的类型?
为什么我们不能仅在结构本身上调用它,即NumField()
?
来自docs:
uS.NumField()
我不太了解type Value struct {
// contains filtered or unexported fields
}
func (v Value) NumField() int
在这里的真正含义。我非常感谢简洁的说明和示例。
答案 0 :(得分:1)
TypeOf返回代表动态类型的
reflection Type
一世。如果i是一个nil接口值,则TypeOf返回nil。
从上面的陈述中可以明显看出,TypeOf
返回了reflection Type
func TypeOf(i interface{}) Type // return reflection type
反射类型在Golang中定义为
Type是Go类型的表示。类型值可比, 例如使用==运算符,因此它们可用作地图键。
Value是Go值的反射接口,您将其用于Numfield方法作为接收器。正如@Flimzy描述的那样,对于任何其他反射方法,您还需要使用反射值。
在您的代码中:
uS := User{}
uSt := reflect.TypeOf(uS)
第一个值us
分配了用户类型struct。从返回值uSt
开始,第二个值reflection Type
被分配为reflect.TypeOf
。检查每个变量的类型:
package main
import (
"reflect"
"fmt"
)
type User struct {}
func main() {
uS := User{}
uSt := reflect.TypeOf(uS)
fmt.Printf("%T\n", uS) // Print the type of uS
fmt.Printf("%T\n", uSt)
}
输出
main.User
*reflect.rtype
有关反射如何工作的更多信息。通过Laws of Reflection
答案 1 :(得分:0)
NumField()是反映结构的函数,一旦您反映了它,就可以将其应用于任何结构。
这不是用户的功能。您没有为用户创建任何功能, 所以我确实试图澄清