GO语言map知识点

package main

import "fmt"

func main() {
	m := map[int]string{
		1: "小红",
		2: "小明",
		3: "小刚",
	}

	m2 := make(map[int]string) //m2 == empty map
	var m3 map[int]string      //m3 == nil
	fmt.Println(m)
	fmt.Println(m2)
	fmt.Println(m3)

	fmt.Println("-------------")
	for k, v := range m {
		fmt.Println(k, v)
	}
}


上述程序包含着几种map的构造方法和打印map的方法
其中,nil和empty map可以混用
运行结果:

GO语言map知识点_第1张图片
问题来了,程序多运行几遍,结果会发生变化:
GO语言map知识点_第2张图片
在解决问题前先来复习一下map的知识点:

package main

import "fmt"

func main() {
	m := map[int]string{
		1: "小红",
		2: "小明",
		3: "小刚",
	}
	name := m[1]
	fmt.Println(name)
	name2 := m[4]
	fmt.Println(name2)
}

有关map的取值
name := m[1],毫无疑问,取的是小红,可是在map中并没有出现4这个key,name2 := m[4]会打印什么呢?
GO语言map知识点_第3张图片
可以看到,打印了一个空字符串
再完善一下代码

package main

import "fmt"

func main() {
	m := map[int]string{
		1: "小红",
		2: "小明",
		3: "小刚",
	}
	name, ok := m[1]
	fmt.Println(name, ok)
	name2, ok := m[4]
	fmt.Println(name2, ok)
}

结果:
GO语言map知识点_第4张图片
即,可以得到,当key不存在的时候,value取到的是该类型值的初始值

再来看看元素的删除:

package main

import "fmt"

func main() {
	m := map[int]string{
		1: "小红",
		2: "小明",
		3: "小刚",
	}

	/*	m2 := make(map[int]string) //m2 == empty map
		var m3 map[int]string      //m3 == nil
		fmt.Println(m)
		fmt.Println(m2)
		fmt.Println(m3)

		fmt.Println("-------------")
		for k, v := range m {
			fmt.Println(k, v)
		}

		fmt.Println("------")*/
	/*name, ok := m[1]
	fmt.Println(name, ok)
	name2, ok := m[4]
	fmt.Println(name2, ok)*/

	fmt.Println("del")
	name, ok := m[1]
	fmt.Println(name, ok)
	delete(m, 1)
	fmt.Println(m)
}

GO语言map知识点_第5张图片
再回到我们开始的问题,map的遍历采用的是range,然后键值对,但这种遍历不保证顺序,如果要保证顺序,要以切片的方式对key进行排序。

补充个知识点:
关于map中的key:

  • map使用哈希表,必须可以比较相等
  • 出了slice,map,function中的内建类型,其他都可以作为key
  • 自定义的结构也可以作为key

你可能感兴趣的:(Go学习,golang,开发语言,后端)