引言
Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。
Map
定义
可以使用内建函数 make 也可以使用 map 关键字来定义 Map:
/* 声明变量,默认 map 是 nil */
var map_variable map[key_data_type]value_data_type
/* 使用 make 函数 */
map_variable := make(map[key_data_type]value_data_type)
如果不初始化 map,那么就会创建一个 nil map。nil map 不能用来存放键值对。
插入
Map [ "France" ] = "Paris"
读取
i := m["France"]
如果 France 存在,就返回那个值,如果不存在,返回0值,也就是说,根据这个value的类型,返回缺省值,比如 string,就返回 “”,int 就返回0。
删除
delete(Map,"France")
如果 France 存在,删除成功,否则什么都没有发生。因为读取在不存在 key 的时候返回 0值,为了区分是否成功,可以采用如下手段
i, ok := m["France"]
遍历
for key, value := range m {
fmt.Println("Key:", key, "Value:", value)
}
实例
创建和使用map
package main
import "fmt"
func main() {
var countryCapitalMap map[string]string /*创建集合 */
countryCapitalMap = make(map[string]string)
/* map插入key - value对,各个国家对应的首都 */
countryCapitalMap [ "France" ] = "Paris"
countryCapitalMap [ "Italy" ] = "罗马"
countryCapitalMap [ "Japan" ] = "东京"
countryCapitalMap [ "India " ] = "新德里"
/*使用键输出地图值 */ for country := range countryCapitalMap {
fmt.Println(country, "首都是", countryCapitalMap [country])
}
/*查看元素在集合中是否存在 */
captial, ok := countryCapitalMap [ "美国" ] /*如果确定是真实的,则存在,否则不存在 */
/*fmt.Println(captial) */
/*fmt.Println(ok) */
if (ok) {
fmt.Println("美国的首都是", captial)
} else {
fmt.Println("美国的首都不存在")
}
}
json转map
json数据:
{
"device": "1",
"data": [
{
"humidity": "27",
"time": "2017-07-03 15:23:12"
}
]
}
代码:
package main
import (
"encoding/json"
"fmt"
)
func main() {
json_str := "{\"device\": \"1\",\"data\": [{\"humidity\": \"27\",\"time\": \"2017-07-03 15:23:12\"}]}"
m := make(map[string]interface{})
// json 反序列化为 map
err := json.Unmarshal([]byte(json_str), &m)
fmt.Println(err)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(m["device"])
data := m["data"]
if v, ok := data.([]interface{})[0].(map[string]interface{}); ok {
fmt.Println(ok, v["humidity"], v["time"])
}
}
}
参考
http://www.runoob.com/go/go-map.html
https://www.jianshu.com/p/ba7852fbcc80