3

新蜂警告。

我可以用字符串键和“任何东西”作为值来制作地图吗?目标是获得配置数据的地图。此数据可以是单个字符串(或布尔值或整数,但可以将其限制为字符串),也可以是字符串数组。示例:我想存储这些项目:

levels = 3
extra-directories = ["foo","bar","baz"]

第一个选项始终是单个值(对我来说可以使用字符串)。第二个选项是零个或多个值。

目标是拥有一个可以存储这些值的地图,并且在查看地图时,我可以switch x.(type)用来找出值是什么。

4

2 回答 2

4

interface{}是一种接受任何类型的类型。

conf := map[string] interface{} {
    "name": "Default",
    "server": "localhost",
    "timeout": 120,
}

conf["name"]是一个interface{}非一个string,并且conf["timeout"]是一个interface{}非一个int。您可以将其传递conf["name"]给采用interface{}like的函数fmt.Println,但不能将其传递给采用stringlike的函数strings.ToUpper,除非您知道interface{}' 的值是 a string(您这样做)并断言它的类型:

name := conf["name"].(string)
fmt.Println("name:", strings.ToUpper(name))
server := conf["server"].(string)
fmt.Println("server:", strings.ToUpper(server))
timeout := conf["timeout"].(int)
fmt.Println("timeout in minutes:",  timeout / 60)

另一个可能适合您的问题的解决方案是定义一个结构:

type Config struct {
    Name string
    Server string
    Timeout int
}

创建配置:

conf := Config{
    Name: "Default",
    Server: "localhost",
    Tiemout: 60,
}

访问配置:

fmt.Println("name:", strings.ToUpper(conf.Name))
fmt.Println("server:", strings.ToUpper(cnf.Server))
fmt.Println("timeout in minutes:",  conf.Timeout / 60)
于 2012-08-03T19:44:09.047 回答
1

是的,您可以使用具有 type 的地图来做到这一点map[string]interface{}

于 2012-08-03T19:00:08.653 回答