不积跬步,无以至千里;不积小流,无以成江海。
Go语言中提供的映射关系容器为 map,其内部使用散列表(hash)实现。
map是一种无序的基于key-value的数据结构,Go语言中的map是 引用类型,( )必须 初始化才能使用。
map定义
map的定义语法如下:
map[KeyType]ValueType
- KeyType:表示键的类型。
- ValueType:表示键对应的值的类型。
map类型的变量默认初始值为 nil,需要使用 make() 函数来分配内存。语法为:
make(map[KeyType]ValueType, [cap])
其中cap表示map的 容量,该参数虽然 不是必须 的,但是我们应该在初始化map的时候就为其指定一个合适的容量。
map 基本使用
map中的数据都是 成对
出现的,map的基本使用示例代码如下:<code>func
main
() {scoreMap
:=make
(map[string]int,8
) scoreMap["张三"
] =100
scoreMap["李四"
] =90
fmt.Println
(scoreMap) fmt.Println
(scoreMap["李四"
]) fmt.Printf
("type of a:%T\n"
, scoreMap) } /<code>
输出:
<code>map
[张三:100
李四:90
]90
type
of a:map
[string
]int
/<code>
map也支持在声明的时候填充元素,例如:
<code>userInfo :=map
[string
]string
{"username"
:"admin"
,"password"
:"123456"
, } fmt.Println(userInfo) /<code>
判断某个键是否存在
Go语言中有个判断map中键是否存在的特殊写法,格式如下:
value, ok := map[key]
<code>func
main
()
{ scoreMap :=make
(map
[string
]int
) scoreMap["张三"
] =90
scoreMap["李四"
] =100
v, ok := scoreMap["张三"
]if
ok { fmt.Println(v) }else
{ fmt.Println("查无此人"
) } } /<code>
map 遍历
Go语言中也是使用for range遍历map。
<code>func
main
() {scoreMap
:=make
(map[string]int) scoreMap["张三"
] =90
scoreMap["李四"
] =100
scoreMap["赵四"
] =60
for k, v := range scoreMap { fmt.Println
(k, v) } } /<code>
输出
<code>赵四
80
张三
100
李四
90
/<code>
注意: 遍历map时的元素顺序与添加键值对的顺序无关。
使用delete()函数删除键值对
使用delete()内建函数从map中删除一组键值对,delete()函数的格式如下:
delete(map, key)
- map:表示要删除键值对的map
- key:表示要删除的键值对的键
<code>func
main
(){scoreMap
:=make
(map[string]int) scoreMap["张三"
] =90
scoreMap["李四"
] =100
scoreMap["赵四"
] =60
delete
(scoreMap,"赵四"
)//将赵四:60
从map中删除 for k,v := range scoreMap{ fmt.Println
(k, v) } } /<code>
按照指定顺序遍历map
<code>rand.Seed(time.Now().UnixNano())var
scoreMap =make
(map
[string
]int
,200
)for
i :=0
; i100
; i++ { key := fmt.Sprintf("stu%02d"
, i) value := rand.Intn(100
) scoreMap[key] = value }var
keys =make
([]string
,0
,200
)for
key :=range
scoreMap { keys =append
(keys, key) } sort.Strings(keys)for
_, key :=range
keys { fmt.Println(key, scoreMap[key]) } /<code>
元素为map类型的切片
<code>func
main
()
{var
mapSlice =make
([]map
[string
]string
,3
)for
index, value :=range
mapSlice { fmt.Printf("index:%d value:%v\n"
, index, value) } fmt.Println("after init"
) mapSlice[0
] =make
(map
[string
]string
,10
) mapSlice[0
]["name"
] ="admin"
mapSlice[0
]["password"
] ="123456"
mapSlice[0
]["age"
] ="20"
for
index, value :=range
mapSlice { fmt.Printf("index:%d value:%v\n"
, index, value) } } /<code>
输出:
<code>0map
[]
1map
[]
2map
[]
after
init
index
:0
value
:map
[age:20 name:admin password:123456]
index
:1
value
:map
[]
index
:2
value
:map
[]
/<code>
值为切片类型的map
<code>var
sliceMap =make
(map
[string
][]string
,3
) fmt.Println(sliceMap) fmt.Println("after init"
) key :="中国"
value, ok := sliceMap[key]if
!ok { value =make
([]string
,0
,2
) } value =append
(value,"北京"
,"上海"
) sliceMap[key] = value fmt.Println(sliceMap) /<code>
输出:
<code>map
[] afterinit
map
[中国:[北京 上海]] /<code>
点关注 不迷路
如果你从本篇内容有收获,求 点赞,求 关注,求 转发 ,让更多的人学习到。
如果本文有任何错误,请批评指教,不胜感激