Go语言中提供了映射关系容器为map,其内部使用散列表(hash)实现。类似Python中的字典。
不同于Python字典的是map的key可以为数字,在声明map时就需要指定 map中key和value的数据类型
package main
import "fmt"
func main() {
//定义了1个map变量,key是sring类型、value是int类型
var m1 map[string]int
fmt.Println(m1 == nil) //还没有初始化(没有在内存中开辟空间)
//初始化:估算好map的容量,避免程序运行期间在扩容
m1 = make(map[string]int, 10)
m1["年龄"] = 18
fmt.Println(m1)
fmt.Println(m1["年龄"])
//获取不存在的key
v, ok := m1["姓名"]
if !ok {
fmt.Println("没有该key")
} else {
fmt.Println(v)
}
//直接获取不存在的key,返回对应类型的默认值
fmt.Println(m1["不存在的key"])
//遍历map的key和value
m2 := make(map[string]string, 10)
m2["姓名"] = "Martin"
m2["性别"] = "男"
for k, v := range m2 {
fmt.Println(k, v)
}
//仅遍历map的keys
for k := range m2 {
fmt.Println(k)
}
//仅遍历map的values
for _, v := range m2 {
fmt.Println(v)
}
//删除map中的key
delete(m2,"姓名")
fmt.Println(m2)
//删除map中不存在的key() no-option
delete(m1,"不存在的key")
/*
go doc builtin.delete 查看内置函数的用法
func delete(m map[Type]Type1, key Type)
The delete built-in function deletes the element with the specified key
(m[key]) from the map. If m is nil or there is no such element, delete is a
no-op.
*/
}
无论是Python的字典还是Go中的map,它们都是无序的。那么我们如何对map进行排序呢?就需要1些迂回的方法;
对map的key进行排序做成切片,然后遍历切片中的key逐一获取map中的元素。
package main
import (
"fmt"
"math/rand" //math包中有个rand模块
"sort"
"time"
)
func main() {
//获取当前时间的 纳秒(随机数字)
rand.Seed(time.Now().UnixNano())
//声明1个map存放{stud纳秒:分数 }
var scoreMap = make(map[string]int, 200)
for i := 0; i < 100; i++ {
key := fmt.Sprintf("stud%2d", i)
value := rand.Intn(100) //生成0-99的随机整数(作为分数)
scoreMap[key] = value
}
var keys = make([]string, 0, 200)
for key := range scoreMap {
keys = append(keys, key)
}
//安装字符串进行排序
sort.Strings(keys)
//通过排序后的key,对map逐一获取值
for _, key := range keys {
fmt.Println(scoreMap[key])
}
}
如何在go里面组织这种多维度的数据类型?
[{"key1":"v1"},{"key2":"v2"}]
{"ke1":["v1","v2","v3"] }
package main
import (
"fmt"
)
//map和slice组合
func main() {
//1.创造1个切片
var s1 = make([]map[int]string, 10, 10)
//注意需要对 内部的map也进行初始化
s1[0] = make(map[int]string, 1)
s1[0][10] = "北京"
fmt.Println(s1)
//2.创造1个map
var m2 = make(map[string][]string, 10)
//对map中的切片进行初始化
m2["北京市"] = []string{"朝阳区", "海淀区", "昌平区"}
fmt.Println(m2)
}
原文:https://www.cnblogs.com/sss4/p/12590944.html