为什么Go反射NumField()仅在类型上可用?

时间:2018-07-23 08:21:08

标签: go struct reflection

我有以下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 在这里的真正含义。我非常感谢简洁的说明和示例。

2 个答案:

答案 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

Playground Example

有关反射如何工作的更多信息。通过Laws of Reflection

答案 1 :(得分:0)

NumField()是反映结构的函数,一旦您反映了它,就可以将其应用于任何结构。

这不是用户的功能。您没有为用户创建任何功能, 所以我确实试图澄清

https://play.golang.org/p/c8oGa_56YfE