22_Go基础(map)

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
", 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
", 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
", 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
", arr, arr)
    fmt.Printf("Type: %T, Value: %v
", sli, sli)
    fmt.Printf("Type: %T, Value: %v
", 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
    }

}
原文地址:https://www.cnblogs.com/luwei0915/p/15357644.html