在go中,map是将值(key)和建(value)关联的内置类型,通过相应的键可以获取到值。
声明:
func main() { var mapList map[string]int //fmt.Println(mapList) if mapList == nil { fmt.Println(mapList) } } // 声明 // key 是 string类型 // value 是 类型 // 变量名 mapList 的 map // 此时的mapList 是空的,默认值是 nil
初始化/创建:
// 声明后是无法使用的 // 添加key-value 会报异常 func main() { var mapList map[string]int mapList["a"] = 1 mapList["b"] = 2 mapList["c"] = 3 fmt.Println(mapList) } // 输出:panic: assignment to entry in nil map // 需要make去创建该map,也可以理解成初始化 func main() { var mapList map[string]int if mapList == nil{ mapList = make(map[string]int) } mapList["a"] = 1 mapList["b"] = 2 mapList["c"] = 3 fmt.Println(mapList) } // 输出:map[a:1 b:2 c:3] // 测试 func main() { var mapList map[string]int if mapList == nil{ mapList = make(map[string]int) } mapList[""] = 1 // "" 空字符也算一个元素 mapList[""] = 4 // 重复会覆盖,上一个 mapList["a"] = 2 mapList["a"] = 5 // 重复会覆盖,上一个 mapList["c"] = 3 fmt.Println(mapList) } // 输出:map[:4 a:5 c:3]
创建时初始化
// 声明时初始化 mapListTwo := map[string]int{ "string":100, "":110, "go":120, } fmt.Println(mapListTwo)
获取元素
// 获取元素 str := mapList["a"] fmt.Println(str,mapList[""],mapList["66"]) // 输出:5 4 0 // 当获取元素是map不存在拿到的就是value类型的默认值 // 声明时初始化 mapListTwo := map[string]string{ "string":"100", "":"110", "go":"120", } mapListOne := map[string]int{ "string":100, "":110, "go":120, } // 获取元素 str := mapListTwo["a"] if str == "" { fmt.Println("str :",str ) } stri := mapListOne["a"] if stri == 0 { fmt.Println("stri :",stri ) } // 输出:str : // 输出:stri : 0
判断元素是否存在map中
// 判断一个元素是否存在map中 func main() { mapListOne := map[string]int{ "string":100, "":110, "go":120, } // 判断一个元素是否存在map中 value,ok := mapListOne["string"] if ok == true { fmt.Println("string : ",value,ok) } values,oks := mapListOne["java"] if oks { fmt.Println("java is ture: ",values,oks) } else { fmt.Println("java is false: ",values,oks) } } // 输出: // string is true: 100 true // java is false: 0 false
遍历map中的所有元素:for range (使用时不能保证每次执行程序获取的元素顺序都相同)
func main() { // 声明&初始化 mapList var mapList map[string]int mapList = make(map[string]int) mapList["string"] = 100 mapList["java"] = 200 mapList["go"] = 300 // 声明初始化 simpleMap simpleMap := map[string]string{ "JSON":"JSON", "java":"java", } // 遍历 map (key,value,ok|遍历和判断是否存在元素) for key,value := range simpleMap { fmt.Printf("simpleMap[%s] = %s \n",key,value) } for key,value := range mapList { fmt.Printf("mapList[%s] = %d \n",key,value) } } // 输出两次执行结果: // simpleMap[JSON] = JSON simpleMap[JSON] = JSON // simpleMap[java] = java simpleMap[java] = java // mapList[string] = 100 mapList[java] = 200 // mapList[java] = 200 mapList[go] = 300 // mapList[go] = 300 mapList[string] = 100
删除map中的元素
func main() { //删除map中的元素 mapList := map[string]int{ "string":1000, "go":2000, "map":3000, } fmt.Println("mapList all ",mapList," length is ",len(mapList)) delete(mapList,"map") fmt.Println("mapList deletion all ",mapList,"length is ",len(mapList)) } // 输出: // mapList all map[go:2000 map:3000 string:1000] length is 3 // mapList deletion all map[go:2000 string:1000] length is 2
map 是引用类型,对map元素的改变即在改变这个map,且这个修改是显性的。
map 类型之间不能使用==
符判断,==
是能用来判断该map是否初始化为nil
。
map声明后必须要初始化才可以使用。
key必须是支持==或!=比较运算的类型(其类型的默认值也可以当作一个key),不可以是函数、map或slice。
使用for range 遍历时是无序的