创建map:

    1. func main() {
    2. // 创建方式1
    3. m := map[string]string {
    4. "name": "ccmouse",
    5. "course": "golang",
    6. "site": "imooc",
    7. "quality": "notbad",
    8. }
    9. fmt.Println(m) // map[quality:notbad name:ccmouse course:golang site:imooc]
    10. // 创建方式2
    11. m2 := make(map[string]int) // m2 == empty map
    12. fmt.Println(m2) // map[]
    13. // 创建方式3
    14. var m3 map[string]int // m3 == nil
    15. fmt.Println(m3) // map[]
    16. }

    map的遍历:
    map是无序的,因此不能保证遍历顺序。如需顺序,需手动对key排序。

    func main() {
        m := map[string]string {
            "name": "ccmouse",
            "course": "golang",
            "site": "imooc",
            "quality": "notbad",
        }
        for k, v := range m {
            fmt.Println(k, v)
        }
        // 只获取key
        for k := range m {
            fmt.Println(k)
        }
        // 只获取value
        for _, v := range m {
            fmt.Println(v)
        }
    }
    

    获取values:

    func main() {
        m := map[string]string {
            "name": "ccmouse",
            "course": "golang",
            "site": "imooc",
            "quality": "notbad",
        }
        courseName := m["course"]
        // 当key不存在时,map[key]将会获得value类型的ZeroValue
        causeName := m["cause"] 
        fmt.Println(causeName) // 空串""(value类型为string,因此获得string类型的ZeroValue空串)
    
        // 用value, ok := m[key] 来检查key是否存在
        courseName, ok := m["course"]
        fmt.Println(courseName, ok) // golang true
        if causeName, ok := m["cause"]; ok {
            fmt.Println(causeName)
        } else {
            fmt.Println("key does not exist")
        } 
    }
    

    删除values:

    func main() {
        m := map[string]string {
            "name": "ccmouse",
            "course": "golang",
            "site": "imooc",
            "quality": "notbad",
        }
        delete(m, "name")
        name, ok := m["name"]
        fmt.Println(name, ok) // ""(空串) false
    }
    

    map的key的类型要求:
    map使用哈希表,因此key必须是可以判断是否相等的类型。
    内建类型,只要不是slice,map,function,就可以作为key。
    Struct类型只要不包括slice,map和function字段,就可以作为key。(Struct类型是否可以作为key的检查在编译时进行)

    map例题:寻找最长的不重复子串

    package main
    
    func lengthOfNonRepeatingSubStr(s string) int {
        // 记录每个字符最后出现的位置
        lastOccurred := make(map[byte]int)
        start := 0
        maxLength := 0
    
        for i, ch := range []byte(s) {
            if lastI, ok := lastOccurred[ch]; ok && lastI >= start {
                start = lastI + 1
            }
            if i - start + 1 > maxLength {
                maxLength = i - start + 1
            }
            lastOccurred[ch] = i
        }
    
        return maxLength
    }