package main
import (
"fmt"
"math/rand"
"sort"
"time"
)
func main() {
// 初始化
mp1 := make(map[int]string, 8)
mp1[0] = "a1"
fmt.Println(mp1) // ap[0:a1]
fmt.Println(mp1[0]) // a1
fmt.Printf("type of a1: %T\n", mp1) // map[int]string
// 声明时填充元素
mp2 := map[string]string{
"name": "张三",
"hair": "long",
}
fmt.Println(mp2) // map[hair:long name:张三]
// 遍历
mp3 := map[string]int{
"Go": 90,
"Python": 80,
"JAVA": 70,
"C++": 60,
}
for k, v := range mp3 {
fmt.Println(k, v)
}
for k := range mp3 {
fmt.Println(k)
}
for _, k := range mp3 {
fmt.Println(k)
}
// 判断 key 是否存在
value, ok := mp3["Go"]
if ok {
fmt.Println(value)
}
// 删除键值对
delete(mp3, "C++")
fmt.Println(mp3)
// 值为 map 类型的切片,类似列表里面放了很多字典
mpSlice := make([]map[string]string, 3)
for i, v := range mpSlice {
fmt.Printf("index: %d, value: %v\n", i, v)
// index: 0, value: map[]
// index: 1, value: map[]
// index: 2, value: map[]
// 对 map 中元素进行初始化
mpSlice[i] = make(map[string]string, 10)
}
// 赋值
mpSlice[0]["k00"] = "v00"
mpSlice[0]["k01"] = "v01"
mpSlice[1]["k10"] = "v10"
mpSlice[1]["k11"] = "v11"
mpSlice[2]["k20"] = "v20"
mpSlice[2]["k21"] = "v21"
fmt.Println(mpSlice) // [map[k00:v00 k01:v01] map[k10:v10 k11:v11] map[k20:v20 k21:v21]]
for i, v := range mpSlice {
for _, v1 := range v {
fmt.Printf("index: %d, value: %v\n", i, v1)
// index: 0, value: v00
// index: 0, value: v01
// index: 1, value: v10
// index: 1, value: v11
// index: 2, value: v21
// index: 2, value: v20
}
}
// 值为切片类型的 map, 类似字典的值是列表
// mp1 := make(map[int]string, 8)
sliceMap := make(map[string][]string, 3)
fmt.Println("初始化 sliceMap 其值 : ", sliceMap) // map[]
key := [2]string{"Country", "City"}
for _, v := range key {
value, ok := sliceMap[v]
// 字典里是否有键,没有也准备一个存储 值 的切片空间
if !ok {
value = make([]string, 0, 2)
}
if v == "Country" {
value = append(value, "中国", "俄罗斯")
} else {
value = append(value, "北京", "西安")
}
sliceMap[v] = value
}
fmt.Println(sliceMap) // map[City:[北京 西安] Country:[中国 俄罗斯]]
// 指定顺序遍历 map
rand.Seed(time.Now().UnixNano()) // 初始化随机数种子
bMap := make(map[string]int, 200) // 申请一个长度200的 map
for i := 0; i < 20; i++ {
key := fmt.Sprintf("stu%02d", i) // 生成 stu 开头的字符串
value := rand.Intn(100) // 0-99 随机整数
bMap[key] = value
}
fmt.Println(bMap, len(bMap))
// 取出 map 中的 keys 放入切片,对 map 进行排序
keys := make([]string, 0, 200)
for key := range bMap {
keys = append(keys, key)
}
fmt.Println("排序前:", keys)
sort.Strings(keys)
fmt.Println("排序后:", keys)
for _, key := range keys {
fmt.Println(key, bMap[key])
}
// 综合有序与无序输出演示
arr := [...]int{1, 2, 5, 4, 3}
sli := []int{1, 2, 5, 4, 3}
mp := map[string]int{
"a1": 1,
"a2": 2,
"a3": 3,
"a4": 5,
"a5": 4,
}
fmt.Printf("Type: %T, Value: %v\n", arr, arr)
fmt.Printf("Type: %T, Value: %v\n", sli, sli)
fmt.Printf("Type: %T, Value: %v\n", mp, mp)
// Type: [5]int, Value: [1 2 5 4 3]
// Type: []int, Value: [1 2 5 4 3]
// Type: map[string]int, Value: map[a1:1 a2:2 a3:3 a4:5 a5:4]
for _, A := range arr {
fmt.Println("查看arr输出顺序", A)
// 查看arr输出顺序 1
// 查看arr输出顺序 2
// 查看arr输出顺序 5
// 查看arr输出顺序 4
// 查看arr输出顺序 3
}
fmt.Println("----------------------")
for _, S := range sli {
fmt.Println("查看sli输出顺序", S)
// 查看sli输出顺序 1
// 查看sli输出顺序 2
// 查看sli输出顺序 5
// 查看sli输出顺序 4
// 查看sli输出顺序 3
}
fmt.Println("----------------------")
for _, M := range mp {
fmt.Println("查看map输出顺序", M)
// 查看map输出顺序 3
// 查看map输出顺序 5
// 查看map输出顺序 4
// 查看map输出顺序 1
// 查看map输出顺序 2
}
}