映射
映射, map是一种无须的基于键值对的数据结构.
Go中映射的声名/初始化如下:
var <mapName> map[<keyType>]<valueType> = make(map[<keyType>]<valueType>, <cap>)
提示
map类型的变量默认初始值为nil
.
例子
go
func main() {
scoreMap := make(map[string]int, 8)
scoreMap["张三"] = 90
scoreMap["小明"] = 100
fmt.Println(scoreMap)
fmt.Println(scoreMap["小明"])
fmt.Printf("type of a:%T\n", scoreMap)
}
判断键的存在
Go中判断某个键是否存在有特殊写法:
<value>, <ok> := map[<key>]
例子
go
func main() {
scoreMap := make(map[string]int)
scoreMap["张三"] = 90
scoreMap["小明"] = 100
// 如果key存在ok为true,v为对应的值;不存在ok为false,v为值类型的零值
v, ok := scoreMap["张三"]
if ok {
fmt.Println(v)
} else {
fmt.Println("查无此人")
}
}
提示
map[<key>]
可以根据上下文决定返回一个值还是两个值. 当你声明两个变量来接受map[<key>]
结果的时候, 编译器知道你需要接受一个值和一个布尔值.
遍历
类似数组的遍历.
删除
可以使用delete
函数删除一组键值对.
delete(<map>, <key>)
例子
go
func main(){
scoreMap := make(map[string]int)
scoreMap["张三"] = 90
scoreMap["小明"] = 100
scoreMap["王五"] = 60
delete(scoreMap, "小明")//将小明:100从map中删除
for k,v := range scoreMap{
fmt.Println(k, v)
}
}
元素为map类型的切片
例子
go
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")
// 对切片中的map元素进行初始化
mapSlice[0] = make(map[string]string, 10)
mapSlice[0]["name"] = "王五"
mapSlice[0]["password"] = "123456"
mapSlice[0]["address"] = "红旗大街"
for index, value := range mapSlice {
fmt.Printf("index:%d value:%v\n", index, value)
}
}
值为切片类型的map
例子
go
func main() {
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)
}
只有键的map
在Go中, 若你只关心键是否存在, 而不关心值, 可以将值类型定义为一个空结构体类型struct{}
. 每个实际的值都是空结构体的一个实例. struct{}{}
在内存中不占用任何空间, 大小为0字节.
例子
go
keysMap := make(map[string]struct{})
keysMap["key1"] = struct{}{}
keysMap["key2"] = struct{}{}
keysMap["key3"] = struct{}{}
_, exists := keysMap["key1"]
if exists {
fmt.Println("key1 exists in the map")
}