Go map相关

微信扫一扫,分享到朋友圈

Go map相关

map

Go
语言中的 map
是一种无序的,基于 key-value
的数据解构,在 Go
语言中 map
是引用类型,因此必须初始化后才能使用。

以下示例将展示如何声明一个 map
类型,以及如何简单使用。

需要注意的是 map
cap
可以进行自动扩容,但是我们应该在初始化 map
的时候就给好适当的容量以提高性能。

package main
import (
"fmt"
)
func main() {
// 初始化一个map,key为string类型,value为int类型,容量为10组
var m = make(map[string]int,10)
// 进行填充数据
m["first"] = 110
m["second"] = 120
m["last"] = 119
// 取出value
fmt.Println(m["first"]) // 110
}

声明填充

在声明 map
时我们就可以对其填充一些数据,这在很多编程语言中都是被允许的, Go
语言中也不例外。

package main
import (
"fmt"
)
func main() {
// 注意,不可指定cap
var userInfo = map[string]string{
"userName":"云崖先生",
"userAge":"18",
"userGender":"male",
}
fmt.Println(userInfo)
// map[userAge:18 userGender:male userName:云崖先生]
}

判断key

Go
语言中有个判断 map
中键是否存在的特殊写法,格式如下:

value, ok := map[key]

示例如下:

package main
import (
"fmt"
)
func main() {
// 注意,不可指定cap
var userInfo = map[string]string{
"userName":"云崖先生",
"userAge":"18",
"userGender":"male",
}
value,ok := userInfo["userHobby"]
if ok{
fmt.Println(value)
}else{
fmt.Println("没有该key")
}
fmt.Printf("%v \n",value) //  一堆空格
fmt.Printf("%v \n",ok) // false
}

遍历map

遍历 map
时应该使用 range
进行遍历,另外由于 map
中的数据是无序的,所以遍历的时候也是无序的。

package main
import (
"fmt"
)
func main() {
// 注意,不可指定cap
var userInfo = map[string]string{
"userName":"云崖先生",
"userAge":"18",
"userGender":"male",
}
for key,value := range userInfo{
fmt.Printf("%v-%v \n",key,value)
}
}

当只想遍历 key
时,可不指定 value

顺序遍历

由于 map
是无序的,所以如果我们想使用顺序遍历,则需要将 key
全部提取到一个 slice
中,遍历 slice
取出 map
中的 value
即可。

package main
import(
"fmt"
"sort"
)
func main() {
m := map[string]string{
"k-2": "第二个",
"k-5": "第五个",
"k-1": "第一个",
"k-4": "第四个",
"k-3": "第三个",
}
slice := make([]string,0,5) // 只能用切片,切片才能append
for key := range(m){
slice = append(slice,key)
}
sort.Strings(slice) // 排序
for _,key := range(slice){
fmt.Println(m[key])
}
}

删除元素

使用内建函数 delete()
可删除 map
中的键值对。

delete(map,key)

示例演示:

package main
import (
"fmt"
)
func main() {
// 注意,不可指定cap
var userInfo = map[string]string{
"userName":"云崖先生",
"userAge":"18",
"userGender":"male",
}
delete(userInfo,"userGender")
fmt.Println(userInfo)
// map[userAge:18 userName:云崖先生]
}

切片的元素是map

切片中的元素可以是 map

package main
import (
"fmt"
)
func main() {
m := map[string]string{
"k-2": "第二个",
"k-5": "第五个",
"k-1": "第一个",
"k-4": "第四个",
"k-3": "第三个",
}
slice := make([]map[string]string, 0, 1) // 该切片内部只能存储map
slice = append(slice, m)
fmt.Println(slice[0]["k-1"])
fmt.Println(slice[0]["k-2"])
}

map的value是切片

一个切片也可以作为 map
value

package main
import (
"fmt"
)
func main() {
// 该map的value必须是slice
var sliceMap = make(map[string][]string, 3)
var sliceValue = make([]string, 0, 3)
sliceValue = append(sliceValue,"slice-1","slice-2","slice-3")
sliceMap["first"] = sliceValue
fmt.Println(sliceMap)
// map[first:[slice-1 slice-2 slice-3]]
}

微信扫一扫,分享到朋友圈

Go map相关

《八佰》超《绝地战警:疾速追击》:成2020全球最卖座电影

上一篇

xenomai内核解析--实时IPC概述

下一篇

你也可能喜欢

Go map相关

长按储存图像,分享给朋友