1.map定义
// var m map[key的类型]value的类型
var a map[string]int
var b map[int]strig
var c map[float]string
2.map声明
package main
import "fmt"
func main() {
// m := map[string]int{}
var m map[string]int
fmt.Println(m) // map[]
}
3.初始化
package main
import "fmt"
func main() {
var m map[string]int
// 初始化
m = make(map[string]int, 15)
// 插入一个键值
m["a"] = 1
fmt.Println(m) // map[a:1]
}
4.声明的同时初始化
package main
import "fmt"
func main() {
m := map[string]int{
"a": 5,
"b": 10,
"c": 20, // 最后的逗号不能丢
}
fmt.Println(m) // map[a:5 b:10 c:20]
}
5.map基本操做
m["a"]
v, ok := m["r"]
if ok {
fmt.Println(v)
} else {
fmt.Println("key不存在")
}
// 存在a这个key则修改,否则新增
m["a"] = 10
delete(m, "a")
package main
import "fmt"
func main() {
m := map[string]int{
"a": 5,
"b": 10,
"c": 20,
}
for k, v := range m {
fmt.Println(k, "---->", v)
}
}
package main
import (
"fmt"
"sort"
)
func main() {
m := map[string]int{
"b": 5,
"a": 10,
"c": 20,
"e": 1,
"g": 2,
"d": 3,
"h": 4,
"f": 9,
}
// 1.定义一个空切片,用来保存key
var keys []string
// 2.对切片对象进行排序
for k, _ := range m {
keys = append(keys, k)
}
sort.Strings(keys) // [a b c d e f g h]
// 3.按照切片顺序取值
for _, k := range keys {
fmt.Println(k, "---->", m[k])
}
}
6.map类型的切片
package main
import "fmt"
func main() {
// 1.声明一个map类型的切片
var mapSlice []map[string]string
// 2.切片初始化
mapSlice = make([]map[string]string, 5)
fmt.Println(mapSlice) // [map[] map[] map[] map[] map[]]
// 3.为切片中的map对象初始化
mapSlice[0] = make(map[string]string, 10)
mapSlice[0]["name"] = "jack"
mapSlice[0]["age"] = "24"
mapSlice[0]["gender"] = "M"
fmt.Println(mapSlice) // [map[age:24 gender:M name:jack] map[] map[] map[] map[]]
}
7.切片类型的map
package main
import "fmt"
func main() {
// 1.声明一个切片类型的map
var sliceMap map[string][]string
// 2.初始化map
sliceMap = make(map[string][]string, 5)
fmt.Println(sliceMap) // map[]
// 3.为map中key为hobby的切片对象初始化
sliceMap["hobby"] = make([]string, 0, 5)
sliceMap["hobby"] = append(sliceMap["hobby"], "basketball")
sliceMap["hobby"] = append(sliceMap["hobby"], "football")
sliceMap["hobby"] = append(sliceMap["hobby"], "badminton")
fmt.Println(sliceMap) // map[hobby:[basketball football badminton]]
}
8.注意
map内部必须使用双引号
map是一个引用类型,必须初始化才能使用,否则panic
package main
import "fmt"
func main() {
m := map[string]int{
"a": 5,
"b": 10,
"c": 20,
}
// 引用拷贝,修改m1的值,会影响m的值
m1 := m
m1["a"] = 6
fmt.Println(m) // map[a:6 b:10 c:20]
fmt.Println(m1) // map[a:6 b:10 c:20]
}
9.Map与工厂模式
map的value可以是一个方法
- 与Go的Dock type接口方式一起,可以方便的实现单一方法对象的工厂模式
package main
import "fmt"
func main() {
sliceMap := map[string]func(num int) int{}
sliceMap["square"] = func(n int) int {
return n * n
}
sliceMap["cube"] = func(n int) int {
return n * n * n
}
fmt.Println(sliceMap["square"](2)) // 4
fmt.Println(sliceMap["cube"](2)) // 8
}
10.使用map实现集合set
- Go的内置集合中没有Set实现,可以使用
map[type]bool