Go语言中的map(十一)
map是一种无序的基于 key-value 的数据结构,Go语言中的map是引用类型,所以跟切片一样需要初始化才能使用。
定义map
定义 map 的语法如下:
map[keyType]ValueType // keyType 键的类型 // ValueType 键对应的值的类型
定义 map 而不初始化时,默认值等于 nil,此时不能直接赋值的,如:
func main() { var a map[string]int // 定义了map fmt.Println(a==nil) // true a["age"] = 100 // error 未初始化直接赋值,会报错 }
可以使用 make() 来给 map 分配内存,有了容量的 map 是可以操作的,格式如下:
make(map[keyType]valueType,[cap]) // 其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量。
map 基本使用
使用 make()定义map:
func main() { myMap := make(map[string]int,3) fmt.Println(myMap) // map[] fmt.Println(myMap==nil) // false myMap["小明"] = 100 fmt.Println(myMap) // map[小明:100] fmt.Println(myMap["小明"]) // 100 fmt.Printf("Type:%T",myMap) // Type:map[string]int }
你也可以直接在定义时填充元素:
func main() { userInfo:=map[string]string{ "username":"wj", "address":"中国", } fmt.Println(userInfo) // map[address:中国 username:wj] fmt.Printf("%#v",userInfo) // map[string]string{"address":"中国", "username":"wj"} // 占位符 "%#v" 输出对应值的Go语法表示 }
判断某个键是否存在
Go语言中有个判断map中键是否存在的特殊写法,格式如下:
value,ok := map[key]
例子:
func main() { userInfo:=map[string]string{ "username":"wj", "address":"中国", } v,ok := userInfo["username"] if ok { fmt.Printf("有username这个key,其值为:%v",v) }else{ fmt.Println("没有username这个key") } }
遍历map
使用 for range 来遍历 map:
func main() { ageMap:=make(map[string]int,3) ageMap["小明"] = 18 ageMap["小红"] = 15 ageMap["小军"] = 16 for k,v:=range ageMap{ fmt.Println(k,v) } } // 小明 18 // 小红 15 // 小军 16
有时如果只想遍历key,我们可以这样写:
for k:_=range ageMap{ fmt.Println(k) }
但在遍历map时,如果只想要遍历key,可以省略_,直接这样写:
for k:=range ageMap{ fmt.Println(k) }
需要注意的是,遍历map时的元素顺序与添加键值对的顺序无关。
使用 delete() 函数删除键值对
使用内建函数 delete() 删除map中的一组键值对,语法格式:
delete(map,key)
例子:
func main() { ageMap:=make(map[string]int,3) ageMap["小明"] = 18 ageMap["小红"] = 15 ageMap["小军"] = 16 delete(ageMap,"小红") // 将 小红:15 删除 for v,k:=range ageMap{ fmt.Println(v,k) } } // 小明 18 // 小军 16
元素为map类型的切片
func main() { var mapSlice = make([]map[string]string,3) // 定义值类型为map的切片,容量为3 for i,v:=range mapSlice{ fmt.Println(i,v) } // mapSlice[0]["username"] = "wj" // error,直接操作切片的map元素会报错 mapSlice[0] = make(map[string]string,3) // 对切片中的 map元素 进行初始化 mapSlice[0]["username"] = "wj" mapSlice[0]["address"] = "中国" for i,v:=range mapSlice{ fmt.Println(i,v) } } // 0 map[] // 1 map[] // 2 map[] // 0 map[address:中国 username:wj] // 1 map[] // 2 map[]
值为切片类型的map
func main() { var sliceMap = make(map[string][]string,3) // 定义值为切片类型的map fmt.Println(sliceMap) sliceMap["address"] = []string{"北京","上海"} fmt.Println(sliceMap) } // map[] // map[address:[北京 上海]]