quot;Perl":8,
"Python":13,
}
value,exists := my_map["Perl"]
if exists {
println("The key exists in map")
}
可以将上面两个步骤合并起来,看着更高大上一些:
if value,exists := my_map["Perl"];exists {
println("key exists in map")
}
方式二:根据map元素返回的value判断。因为该map中的value部分是int类型,所以它的0是数值的0。
my_map := map[string]int{
"Java":11,
"Perl":8,
"Python":13,
}
value := my_map["Shell"]
if value == 0 {
println{"not exists in map"}
}
如果map的value数据类型是string,则判断是否为空:
if value == "" {
println("not exists in map")
}
由于map中的value有可能本身是存在的,但它的值为0,这时就会出现误判断。例如下面的"Shell",它已经存在,但它对应的值为0。
my_map := map[string]int{
"Java":11,
"Perl":8,
"Python":13,
"Shell":0,
}
所以,应当使用第一种方式进行判断元素是否存在。
迭代遍历map
因为map是key/value类型的数据结构,key就是map的index,所以range关键字对map操作时,将返回key和value。
my_map := map[string]int{
"Java":11,
"Perl":8,
"Python":13,
"Shell":23,
}
for key,value := range my_map {
println("key:",key," value:",value)
}
获取map中所有的key
Go中没有提供直接获取map所有key的函数。所以,只能自己写,方式很简单,range遍历map,将遍历到的key放进一个slice中保存起来。
package main
import "fmt"
func main() {
my_map := map[string]int{
"Java": 11,
"Perl": 8,
"Python": 13,
"Shell": 23,
}
// 保存map中key的slice
// slice类型要和map的key类型一致
keys := make([]string,0,len(my_map))
// 将map中的key遍历到keys中
for map_key,_ := range my_map {
keys = append(keys,map_key)
}
fmt.Println(keys)
}
注意上面声明的slice中要限制长度为0,否则声明为长度4、容量4的slice,而这4个元素都是空值,而且后面append()会直接对slice进行一次扩容,导致append()后的slice长度为map长度的2倍,前一半为空,后一般才是map中的key。
传递map给函数
map是一种指针,所以将map传递给函数,仅仅只是复制这个指针,所以函数内部对map的操作会直接修改外部的map。
例如,addone()用于给map的key对应的值加1。
package main
func main() {
my_map := map[string]int{
"Java": 11,
"Perl": 8,
"Python": 13,
"Shell": 23,
}
println(my_map["Perl"]) // 8
addone(my_map,"Perl")
println(my_map["Perl"]) // 9
}
func addone(m map[string]int,key string) {
m[key] += 1
}