如何使用reflect按名称获取包常量值?

Sun*_*way 2 reflection go

这是一个具有一些常量的包。

package object

type Languaege int

const (
    Javascript Languaege = iota
    C
    Cpp
    Shell
)
Run Code Online (Sandbox Code Playgroud)

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

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

package main
func GetConstByName(name String) {
    ....
}
lang := GetConstByName("Shell")
Run Code Online (Sandbox Code Playgroud)

Nic*_*ood 5

Language如果您想保留整数类型,我认为除了手动之外您无法做到这一点const

这就是我要做的 - 让 Language 实现Stringer这意味着你也可以打印它。然后您可以反转languageMap将语言字符串转换为Language

游乐场链接

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"))
}
Run Code Online (Sandbox Code Playgroud)

这输出

C is 1: C: 1
Shell is 3: Shell: 3
Run Code Online (Sandbox Code Playgroud)