reflection - 如何使用反射按名称获取包常量值?

标签 reflection go

这是一个包含一些常量的包。

package object

type Languaege int

const (
    Javascript Languaege = iota
    C
    Cpp
    Shell
)

//========================================

如果我知道类型语言的名称,我如何获取类型语言的值?

package main
func GetConstByName(name String) {
    ....
}
lang := GetConstByName("Shell")

最佳答案

如果您希望 Language 保持 const 整数类型,我认为您只能手动完成。

这是我要做的 - 制作语言工具 Stringer这意味着您也可以打印它。然后,您可以反转 languageMap 以将语言字符串转换为 Language

Playground link

package main

import "fmt"

type Language int

const (
    Javascript Language = iota
    C
    Cpp
    Shell
)

var languageMap = map[Language]string{
    Javascript: "Javascript",
    C:          "C",
    Cpp:        "Cpp",
    Shell:      "Shell",
}

func (l Language) String() string {
    return languageMap[l]
}

var languageMapReverse map[string]Language

func NewLanguage(languageName string) Language {
    if languageMapReverse == nil {
        languageMapReverse = make(map[string]Language)
        for l, name := range languageMap {
            languageMapReverse[name] = l
        }
    }
    return languageMapReverse[languageName]
}

func main() {
    fmt.Printf("C is %d: %s: %d\n", C, C, NewLanguage("C"))
    fmt.Printf("Shell is %d: %s: %d\n", Shell, Shell, NewLanguage("Shell"))
}

这输出

C is 1: C: 1
Shell is 3: Shell: 3

关于reflection - 如何使用反射按名称获取包常量值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14098757/

相关文章:

google-app-engine - Golang 谷歌存储可恢复上传 HTTP 401

go - Websocket 发送到特定客户端而不是广播

使用反射调用 PumpEvents 时出现 java.lang.illegalArgumentException

.net - 构造 ArgumentException 时如何以编程方式确定参数名称?

reflection - 使用反射和结构来构建通用处理程序函数

go - AWS Cognito 的 SMS 多因素身份验证返回无效代码或身份验证状态

Docker build 如何在golang build中添加库

windows - 如何避免http包合并?

android - 为什么连接到由 createRfcommSocket 创建的套接字比 createInsecureRfcommSocketToServiceRecord 更快?

.net - 如何使用FastMember获取成员(member)的属性数据