string - 在golang中使用字符串调用结构字段

标签 string go struct reflection

我想用字符串调用结构的一个字段,所以我 checkout ,发现需要使用反射包。
这是我的代码:

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

克里斯

最佳答案

cmd.echo不是方法。这是功能类型的字段。使用Value.FieldByName()访问它。

并且只能访问导出的字段,将其重命名为Echo

而且您必须传递一个非指针的cmd,或者,如果传递&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)

关于string - 在golang中使用字符串调用结构字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61057114/

相关文章:

r - 从R中的字符串中提取模式而不区分大小写字母

go - 使用 Golang 从 Google OAuth ID token 获取电子邮件

go - Go包命名约定背后的想法是什么?

c - 如何订购相互使用的 C 结构/函数声明?

c++ - 如何删除 VS 警告 C4091 : 'typedef ' : ignored on left of 'SPREADSHEET' when no variable is declared

c++ - 在类定义中使用结构的细节和好处

c++ - 将迭代器存储到字符串中(转换、转换、追加?)

在其他函数中使用 malloc 更改字符串

C-Compiler 在将字符串分配给 char 数组时说 "Cannot convert char * to char"

go - 附加到结果 slice