map
go语言中提供映射关系容器为map,其内部使用散列表 hash 实现。
map是一种无序的基于key-value的数据结构,go语言中的map是引用类型,必须初始化才能使用。
map定义
go语言中map的定义语法如下:
map[keyType]valueType
简单的map
package main
import "fmt"
func main() {
a1 := make(map[string]int, 10) //此处的容量最好估算好,避免动态扩容影响性能
fmt.Println(a1)
}
map赋值
package main
import "fmt"
func main() {
a1 := make(map[string]int, 10) //此处的容量最好估算好,避免动态扩容影响性能
fmt.Println(a1)
a1["王五"] = 20
a1["张三"] = 999
fmt.Println(a1)
}
判断某个键存不存在
package main
import (
"fmt"
)
func main() {
a1 := make(map[string]int, 10) //此处的容量最好估算好,避免动态扩容影响性能
fmt.Println(a1)
a1["王五"] = 20
a1["张三"] = 999
fmt.Println(a1)
value, ok := a1["李四"]
if !ok { //这里是约定成俗的用ok来接收布尔值
fmt.Println("查无次key")
} else {
fmt.Println(value)
}
}
map的遍历
遍历key和value
for key, value := range a1 {
fmt.Println(key, value)
}
遍历key
for key := range a1 {
fmt.Println(key)
}
遍历value
for _, value := range a1 {
fmt.Println(value)
}
//使用匿名函数即可
map key的删除
delete(a1, "张三")
//delete(map的变量名,需要删除的key名)
fmt.Println(a1)
//注意删除一个空值也不会报错
delete(a1, "张飞")
map指定顺序
package main
import (
"crypto/rand"
"fmt"
"sort"
"time"
)
func main() {
//生成随机数
rand.Seed(time.Now().UnixNano())
var scoreMap = make(map[string]int, 200)
//将生成的随机数存入map中,这里的map的key和value分别是学生学号,学生成绩,现在要求是按照成绩排序从高往低排
for i := 0; i < 100; i++ {
key := fmt.Sprintf("stu%02d", i)
value := rand.Intn(100)
scoreMap[key] = value
}
//将要排序的key值保存到切片中
var keys = make([]string, 0, 200)
for key := range scoreMap {
keys = append(keys, key)
}
//排序
sort.Strings(keys)
//输出排序的内容
for _, key := range keys {
fmt.Println(key, scoreMap[key])
}
}
// 执行不成功,应该是所用的包发生了变化
map和slice组合初始化
元素为map类型的切片
slice名称 := make([]map[map的key的类型]map的value的类型,slice的长度大小,slice的存储大小)
//还要再初始化map
slice名称[0] = make(map[map的key类型]map的value的类型,map的存储大小)
使用
package main
import "fmt"
func main() {
a1 := make([]map[int]string, 5, 10)
a1[0] = make(map[int]string)
a1[0][100] = "优秀"
fmt.Println(a1)
}
值为切片类型的map
map的名称 := make([map的key的类型][]切片的类型)
使用
package main
import "fmt"
func main() {
m1 := make(map[string][]int, 10)
m1["北京"] = []int{1, 2, 3, 4}
fmt.Println(m1)
}

浙公网安备 33010602011771号