与字符串键和字符串或切片值的映射?
问题描述:
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
功能,但你不能把它传递给需要string
像strings.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)
答
是的,你可以使用类型为map[string]interface{}
的地图。
技术上接口{}是所有类型实现一个接口。这是一个微妙的区别,但值得一提。 – 2012-08-04 00:59:56
@JeremyWall我仍然需要这么多的学习。谢谢! – topskip 2012-08-05 18:39:13