如何使用reflect通过名称获取包const值?

时间:2012-12-31 07:25:11

标签: reflection go

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

package object

type Languaege int

const (
    Javascript Languaege = iota
    C
    Cpp
    Shell
)

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

如果我知道它的名字,我怎么能得到一种类型的语言?

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

2 个答案:

答案 0 :(得分:3)

如果您希望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

答案 1 :(得分:1)

你试图滥用反思。在这种情况下,幸运的是,它将无法正常工作。如果您想映射字符串键到某些关联值,请改用map[string]someValueType