与字符串键和字符串或切片值的映射?

问题描述:

Newbee警告。与字符串键和字符串或切片值的映射?

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

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

第一个选项始终是单个值(字符串对我来说应该是OK)。第二个选项是零个或多个值。

目标是让我可以存储这些值的单个地图,并且在查看地图时,我可以使用switch x.(type)来查明该值。

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

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

conf["name"]interface{}不是string,和conf["timeout"]interface{}不是int。您可以通过conf["name"]受到充分interface{}fmt.Println功能,但你不能把它传递给需要stringstrings.ToUpper,除非你知道interface{}的价值是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) 
+0

技术上接口{}是所有类型实现一个接口。这是一个微妙的区别,但值得一提。 – 2012-08-04 00:59:56

+0

@JeremyWall我仍然需要这么多的学习。谢谢! – topskip 2012-08-05 18:39:13

是的,你可以使用类型为map[string]interface{}的地图。