今天我们来学习一下Go语言中的Map和它的基本使用。
简介
Go语言中map
是为映射关系的容器,它的内部使用的是散列表(hash)
来实现的。map是一种无序的基于key-value
的数据结构,Go语言中的map是引用类型的,因此使用前需要进行初始化的操作。
定义
语法
Go语言中map
定义语法如下:
map[keyType]valueType
说明
keyType
- 表示键的类型valueType
- 表示对应值的类型
map类型默认初始值是nil,需要make()
进来内在分配,语法如下:
make(map[keyType]valueType, [cap])
cap
为map的容量,是非必须的,但是我们在初始化的过程中尽量先分配一个合适的容量。
基本使用
方式一:先声明后赋值
话不多说,小示例:
func main() {
scoreMap := make(map[string]int, 3)
scoreMap["张三"] = 69
scoreMap["李四"] = 32
scoreMap["王五"] = 80
fmt.Println(scoreMap)
fmt.Println(scoreMap["张三"])
fmt.Printf("type of is %T, len of is %d\n", scoreMap, len(scoreMap))
}
结果:
map[张三:69 李四:32 王五:80]
69
type of is map[string]int, len of is 3
方式二:声明时赋值
map同样也支持声明的时候进行赋值操作,如下:
func main() {
userInfo := map[string]string{
"username": "小明",
"password": "haha",
}
fmt.Println(userInfo)
fmt.Println(userInfo["username"])
fmt.Printf("type of is %T, len of is %d\n", userInfo, len(userInfo))
}
结果:
map[password:haha username:小明]
小明
type of is map[string]string, len of is 2
常见的操作
遍历
常规遍历
使用for range
进行遍历:
func main() {
testMap := map[string]string{
"t01": "1111",
"t02": "2222",
"t03": "3333",
"t04": "4444",
}
for key, val := range userInfo {
fmt.Printf("key is %s, val is %s\n", key, val)
}
}
结果:
key is t03, val is 3333
key is t04, val is 4444
key is t01, val is 1111
key is t02, val is 2222
从上面的结果中我们可以看出来,map存储时是无序的,如果想按指定顺序进行遍历还是要费点功夫的,下面就来演示一下。
按照顺序遍历
func main() {
testMap := map[string]string{
"t01": "1111",
"t02": "2222",
"t03": "3333",
"t04": "4444",
}
// 先把map的key放入切片中
keys := make([]string, 0, len(testMap))
for key := range testMap {
keys = append(keys, key)
}
// 再对切片进行排序
sort.Strings(keys)
// 然后按排好的顺序进行遍历即可
for _, key := range keys {
fmt.Printf("key1 is %s, val is %s\n", key, testMap[key])
}
}
结果:
key1 is t01, val is 1111
key1 is t02, val is 2222
key1 is t03, val is 3333
key1 is t04, val is 4444
判断某个键是否存在
Go语言中有个判断map中键是否存在的语法,格式如下:
value, ok := map[key]
来个小示例看一下它的使用场景吧:
func main() {
userInfo := map[string]string{
"username": "小明",
"password": "haha",
}
// 如果key存在,则ok为true,value为对应的值,不存在是ok为false,value为对应值的默认值
if value, ok := userInfo["username"]; ok {
fmt.Printf("找到该键对应的值 %v \n", value)
} else {
fmt.Println("未找到该键对应的值")
}
}
删除某个元素
使用delete()
内建函数可以删除map中的一组键值中对,格式如下:
delete(map, key)
说明:
map
- 要删除键值对的mapkey
- 要删除键值对的键名
来个小示例:
func main() {
userInfo := map[string]string{
"username": "小明",
"password": "haha",
}
// 将username从map中删除
delete(userInfo, "username")
fmt.Println(userInfo)
}
至此map相关的东西就差不多了,还有map类型的切片、切片类的map等这些自己探索去吧~