Вызовите поле структуры со строкой в ​​golang - PullRequest
0 голосов
/ 06 апреля 2020

Я хочу назвать поле моей структуры строкой, поэтому я проверил и увидел, что мне нужно использовать пакет отражения. Вот мой код:

package main

import (
    "fmt"
    "reflect"
)


type cmd struct{
    echo func() (string,error)
}



func main() {
    cmd:=cmd{
        echo : func () (string,error){
            return "test", nil
        },
    }
    fmt.Println(reflect.ValueOf(&cmd).MethodByName("echo").Call([]reflect.Value{}))

}

И когда я хочу его построить, он паникует как:

panic: reflect: call of reflect.Value.Call on zero Value

goroutine 1 [running]:
reflect.flag.mustBe(...)
        c:/go/src/reflect/value.go:208
reflect.Value.Call(0x0, 0x0, 0x0, 0xc0000c7f50, 0x0, 0x0, 0x0, 0x0, 0xc000086058)
        c:/go/src/reflect/value.go:319 +0x174

Я не понимаю []reflect.Value{}, зачем мне это использовать на линии:

reflect.ValueOf(&cmd).MethodByName("echo").Call([]reflect.Value{})

Надеюсь, кто-то может помочь! : D

Крис

1 Ответ

1 голос
/ 06 апреля 2020

cmd.echo не является методом. Это поле типа функции. Получите доступ к нему, используя Value.FieldByName().

. И только к экспортированным полям можно получить доступ, переименуйте его в Echo.

И вы должны передать не указатель cmd, или если вы Pass &cmd, вы должны позвонить Value.Elem().

Рабочий пример:

type cmd struct {
    Echo func() (string, error)
}

cmd := cmd{
    Echo: func() (string, error) {
        return "test", nil
    },
}
fmt.Println(reflect.ValueOf(cmd).FieldByName("Echo").Call([]reflect.Value{}))

Это выводит (попробуйте на Go Playground ):

[test <error Value>]

Также обратите внимание, что если функция не имеет параметров, вы передаете nil Value.Call():

reflect.ValueOf(cmd).FieldByName("Echo").Call(nil)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...