<8>Golang基础进阶——Map
Golang基础进阶——Map
映射(map)一一建立事物关联的容器
Map 是go内置的数据结构,是一种无序的键值对的集合,可以通过key快速找到,Map必须初始化才能使用,否则报错。
map 的定义:
var 变量名 map[KeyType]ValueType
示例1:
func main() {
var m1 map[int]string
fmt.Println(m1 == nil) // true
fmt.Println(m1) // map[]
m2 := map[int]string{}
m3 := make(map[int]string)
fmt.Println(m2, m3) // map[] map[]
fmt.Println(m2[1]) // 字符串默认为空
m4 := make(map[int]string, 10)
m4[1] = "wsl"
fmt.Println(m4[1])
fmt.Println(len(m4))
var m5 = map[int]string{1: "啥", 2: "啊"}
fmt.Println(m5)
m6 := map[int]string{1: "啊", 2: "大"}
fmt.Println(m6)
}
示例2:
func main() {
m1 := map[int]string{1: "zs", 2: "ls"}
m1[1] = "ww"
m1[3] = "ss"
fmt.Println(m1) // map[1:ww 2:ls 3:ss]
m2 := make(map[int]string, 8)
m2[0] = "aaa"
m2[1] = "bbb"
fmt.Println(m2[0]) // aaa
}
map的遍历、遍历、查找
func main() {
m1 := map[int]string{1: "ww", 2: "ls"}
m1[1] = "www"
m1[3] = "ss"
for k, v := range m1 {
fmt.Println(k, v)
}
value, ok := m1[5]
fmt.Println("value=", value, "ok=", ok)
// 删除key
delete(m1, 1)
fmt.Println(m1)
}
map的排序
func main() {
rand.Seed(time.Now().UnixNano())
var a = make(map[string]int, 10)
for i := 0; i < 10; i++ {
key := fmt.Sprintf("stu%d", i)
value := rand.Intn(1000)
a[key] = value
}
var keys = make([]string, 0, 10)
for key := range a {
keys = append(keys, key)
}
sort.Strings(keys)
for _, v := range keys {
fmt.Println(v, a[v])
}
}
map引用类型示例:
func modify(a map[int]string) {
a[1003] = "by"
}
func main() {
var a map[int]string
a = make(map[int]string, 10)
// 声明之后不能直接使用,必须使用make初始化
a[1001] = "stu1"
a[1002] = "stu1"
a[1003] = "stu1"
b := a
b[1003] = "wsl"
fmt.Println(a) // map[1001:stu1 1002:stu1 1003:wsl]
modify(a)
fmt.Println(a) // map[1001:stu1 1002:stu1 1003:by]
}
map类型的切片
func main() {
var s []map[int]string
s = make([]map[int]string, 5, 10)
for i, v := range s {
fmt.Println(i, v)
}
s[0] = make(map[int]string, 10)
s[0][1001] = "wsl1"
s[0][1002] = "wsl2"
s[0][1003] = "wsl3"
for i, v := range s[0] {
fmt.Println(i, v)
}
}
值为切片类型的map
func main() {
var s map[int][]string
s = make(map[int][]string, 10)
key := 1000
value, ok := s[key]
if !ok {
s[key] = make([]string, 0, 10)
value = s[key]
}
value = append(value, "stu1")
value = append(value, "stu2")
s[key] = value
fmt.Println(s) // map[1000:[stu1 stu2]]
}
清空map中的所有元素
有意思的是, Go 语言中并没有为 map 提供任何清空所有元素的函数、方法。清空 map 的唯一办法就是重新 make 一个新的 map 。不用担心垃圾回收的效率 Go 语言中的并行垃
圾回收效率比写一个清空函数高效多了。
小练习:
写一个程序,统计一个字符串每个单词出现的次数,例如统计s=”hello ni hao hello hello”,输出hello=3 ni=1 hao=1
func WordCount(str string) map[string]int {
words := strings.Split(str, " ")
// 返回的map
var result map[string]int = make(map[string]int, 16)
for _, v := range words {
// 看结果里 ,有没有
count, ok := result[v]
if !ok {
result[v] = 1
} else {
result[v] = count + 1
}
}
return result
}
func main() {
var str = "hello ni hao hello hello"
res := WordCount(str)
// 遍历
for k, v := range res {
fmt.Printf("%s=%d ", k, v)
}
}
加油,你们是最棒的!

浙公网安备 33010602011771号