ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
> ### 例子一 ~~~ package main import ( "fmt" ) //map的key必须是支持==或!=比较运算的类型,不可以是函数,map或slice //map的value 则没有任何的限制 //make 根据size 大小来初始化分配内存,不过分配后的 map 长度为0。 如果 size 被忽略了,那么会在初始化分配内存的时候 分配一个小尺寸的内存 //map的迭代顺序是随机的 func main() { //map 在使用之前必须用 make 而不是 new 来创建;值为 nil 的 map 是空的,并且不能赋值 var number1 map[int]string number2 := make(map[int]string, 5) number3 := map[string]int{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5} fmt.Printf("Number1: %v, len:%d \r\n", number1, len(number1)) fmt.Printf("Number2: %v, len:%d \r\n", number2, len(number2)) fmt.Printf("Number3-1: %v, len:%d \r\n", number3, len(number3)) delete(number3, "c") fmt.Printf("Number3-2: %v, len:%d \r\n", number3, len(number3)) number3["f"] = 6 fmt.Printf("Number3-3: %v, len:%d \r\n", number3, len(number3)) //引用类型 var number4 = map[string]int{"a": 1, "b": 2, "c": 3, "d": 4, "e": 4} fmt.Println("Number4-1:", number4) number5 := number4 number5["e"] = 5 fmt.Println("Number4-2:", number4) } ~~~ > ### 例子二(无序输出和有序输出) ~~~ package main import ( "fmt" "math/rand" "sort" "time" ) func main() { r := rand.New(rand.NewSource(time.Now().UnixNano())) var number6 map[int][]int number6 = make(map[int][]int, 5) for i := 0; i < 5; i++ { _, ok := number6[i] if !ok { number6[i] = make([]int, 0, 3) } number6[i] = append(number6[i], r.Intn(100), r.Intn(100), r.Intn(100)) } fmt.Println("无序输出") for k, v := range number6 { fmt.Printf("k: %d, v: %d \r\n", k, v) } fmt.Println("有序输出") var number7 []int for k, _ := range number6 { number7 = append(number7, k) } sort.Ints(number7) for _, v := range number7 { fmt.Printf("k: %d, v: %d \r\n", v, number6[v]) } } ~~~ > ### 例子三 ~~~ package main import "fmt" func main() { var m map[string]int if _, ok := m["first"]; !ok { m = make(map[string]int, 5) } m["first"] = 11111 fmt.Println(m) } ~~~ > ### delete ~~~ package main import "fmt" func main() { //删除对应的键值对,如果集合为空或找不到对应的键,则无操作 number := map[string]int{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5} fmt.Println(number) delete(number, "b") fmt.Println(number) delete(number, "f") fmt.Println(number) } ~~~ > ### 为什么map会提示并发写和读的错误, 变量又不会 ??? * 在标准库的源代码里能看到,map 内部进行了保护,如果发现了并发访问就会报 fatal error(不是 panic,所以无法 recover)。普通的变量类型没有这个机制。 > ### 相关阅读 * [golang map源码详解](https://blog.yiz96.com/golang-map/)