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"] = // error 未初始化直接赋值,会报错
}

可以使用 make() 来给 map 分配内存,有了容量的 map 是可以操作的,格式如下:

make(map[keyType]valueType,[cap])

// 其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量。

map 基本使用

使用 make()定义map:

func main() {
myMap := make(map[string]int,)
fmt.Println(myMap) // map[]
fmt.Println(myMap==nil) // false
myMap["小明"] =
fmt.Println(myMap) // map[小明:100]
fmt.Println(myMap["小明"]) //
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,)
ageMap["小明"] =
ageMap["小红"] =
ageMap["小军"] = 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,)
ageMap["小明"] =
ageMap["小红"] =
ageMap["小军"] =
delete(ageMap,"小红") // 将 小红:15 删除
for v,k:=range ageMap{
fmt.Println(v,k)
}
} // 小明 18
// 小军 16

元素为map类型的切片

func main() {
var mapSlice = make([]map[string]string,) // 定义值类型为map的切片,容量为3
for i,v:=range mapSlice{
fmt.Println(i,v)
}
// mapSlice[0]["username"] = "wj" // error,直接操作切片的map元素会报错 mapSlice[] = make(map[string]string,) // 对切片中的 map元素 进行初始化
mapSlice[]["username"] = "wj"
mapSlice[]["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,) // 定义值为切片类型的map
fmt.Println(sliceMap)
sliceMap["address"] = []string{"北京","上海"}
fmt.Println(sliceMap)
} // map[]
// map[address:[北京 上海]]
上一篇:.NET面试题系列[5] - 垃圾回收:概念与策略


下一篇:Python3 标准库