map是go语言中的一种引用类型,所有它具备引用类型的特点,比如拷贝方式、需要初始化等等。map在go语言中通过key和value来访问,并且是无序的,也就是每次迭代的时候,顺序都不一样。
map定义
使用关键字map来定义一个map变量
func main() {
//var m = map[int]string{1: "hello world"}
m := make(map[int]string)
m[1] = "hello world"
fmt.Println(m)
}
初始化
和slice一样通过make关键字来初始化变量。map可以不传参数,而slice至少传一个,那就是长度。如果一个没有初始化的map是无法使用的。会直接触发panic
编译可以成功
PS C:UserscaojiaoyueDesktopgolang> go build PS C:UserscaojiaoyueDesktopgolang> .golang.exe panic: assignment to entry in nil map goroutine 1 [running]: main.main() C:/Users/caojiaoyue/Desktop/golang/main.go:11 +0x4a
操作key
添加key
func main() { var m map[int]string m = make(map[int]string) m[1] = "hello world" fmt.Println(m) }
删除key
使用delete关键字,第一个参数要操作的map,第二个参数要删除的key
func main() { var m map[string]string m = make(map[string]string) m["1"] = "hello world" m["2"] = "hello world1" delete(m, "1") fmt.Println(m) }
map迭代
使用range函数 返回的第一个参数是key,第二个函数是value
func main() { var m map[string]string m = make(map[string]string) m["1"] = "hello world" m["2"] = "hello world1" for k, v := range m { fmt.Println(k, v) } }
判断某个key是否存在
key, ok := m["3"],如果存在ok为true,key就是这个map key对应的值
func main() { var m map[string]string m = make(map[string]string) m["1"] = "hello world" m["2"] = "hello world1" key, ok := m["3"] if !ok { fmt.Println("不存在") } fmt.Println(key) }
map in map
需要注意的是里层的map初始化
func main() { var m map[int]map[string]string m = make(map[int]map[string]string) m[1] = make(map[string]string) m[1]["name"] = "caojioyue" m[1]["sex"] = "man" m[2] = make(map[string]string) m[2]["name"] = "caojioyue" m[2]["sex"] = "man" fmt.Println(m) }
map in slice
func main() { var m []map[int]string m = make([]map[int]string, 2) m[0] = map[int]string{1: "caojiaoyue", 2: "hello"} fmt.Println(m) }
slice in value of map
func main() { var m map[int][]string m = make(map[int][]string) m[1] = []string{"caojiaoyue", "hello"} m[2] = []string{"caojiaoyue", "hello"} fmt.Println(m) }