反思中的问题

时间:2014-08-29 08:24:40

标签: reflection go

我试图在go中使用反射。为什么这段代码没有列出方法?它列出了字段。

这是问题吗? "价值界面{}"我不确定如何将通用的struct / class / type传递给函数。通常我会传递一个Object。

(我对此非常陌生。我是C#程序员)

package main

import (
"fmt"
"reflect"
)

func main() {
    var B TestType = TestType{TestString: "Hello", TestNumber: 3}
    ListMethods(B)
}

func ListMethods(value interface{}) {

    fooType := reflect.TypeOf(value)

    for i := 0; i < fooType.NumMethod(); i++ {
        method := fooType.Method(i)
        fmt.Println("Method = " + method.Name)
    }

    for i := 0; i < fooType.NumField(); i++ {
        field := fooType.Field(i)
        fmt.Println("Field = " + field.Name)
        fmt.Println(reflect.ValueOf(value).Field(i))
    }
}

type TestType struct {
    TestString string
    TestNumber int
}

func (this *TestType) TestFunction() {
    fmt.Println("Test")
}

1 个答案:

答案 0 :(得分:2)

因为您正在传递一个类型,并且您将一个方法声明为该类型的指针。

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

看看你的扩展示例:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var B TestType = TestType{TestString: "Hello", TestNumber: 3}
    ListMethods(B)
}

func ListMethods(value interface{}) {

    fooType := reflect.TypeOf(value)
    ptrFooType := reflect.PtrTo(fooType)

    for i := 0; i < fooType.NumMethod(); i++ {
        method := fooType.Method(i)
        fmt.Println("Method = " + method.Name)
    }

    for i := 0; i < ptrFooType.NumMethod(); i++ {
        method := ptrFooType.Method(i)
        fmt.Println("* Method = " + method.Name)
    }

    for i := 0; i < fooType.NumField(); i++ {
        field := fooType.Field(i)
        fmt.Println("Field = " + field.Name)
        fmt.Println(reflect.ValueOf(value).Field(i))
    }
}

type TestType struct {
    TestString string
    TestNumber int
}

func (this *TestType) TestFunctionPtr() {
    fmt.Println("Test")
}

func (this TestType) TestFunction() {
    fmt.Println("Test Non Ptr")
}

注意*Type如何访问Type方法。但Type无法访问*Type方法。

要从Type转换为*Type,我使用了reflect.PtrTo(Type)