反思问题

I'm trying to use reflection in go. Why doesn't this code list the methods? It lists the fields.

is this the problem? "value interface{}" I'm not sure how to pass a generic struct/class/type to a function. Normally I would just pass an Object.

(I'm totally new at this. I'm a C# programmer)

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")
}

Because you are passing a type and you declared a method to the pointer of the type.

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

Look at this example extended from yours:

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")
}

Notice how the *Type can access also the Type Methods. But Type cannot access to *Type Methods.

To convert from Type to *Type I have used the reflect.PtrTo(Type).