← 返回首页
Go基础教程(十二)
发表时间:2022-11-24 20:37:46
字典

Go语言提供的字典容器为 map,等同于Java语言的Map容器类型。

1.Map初始化与遍历

package main

import "fmt"

func main() {
    // 定义一个键类型为string,值类型为string的 map
    citys := make(map[string]string)

    citys["010"] = "北京"
    citys["020"] = "广州"
    citys["021"] = "上海"
    citys["029"] = "西安"
    citys["027"] = "武汉"
    citys["025"] = "南京"

    fmt.Println(citys)

    //输出一个不存在的key
    fmt.Println("099:", citys["099"])

}

运行结果:

map[010:北京 020:广州 021:上海 025:南京 027:武汉 029:西安]
099: 

map的另外一种初始化方式,类似json对象的初始化,但是必须注意最后一项也必须以逗号结尾:

package main

import (
    "fmt"
)

func main() {

    citys := map[string](string){
        "010": "北京",
        "021": "上海",
        "020": "广州",
        "029": "西安",
        "027": "武汉",
    }

    fmt.Println(citys)
    fmt.Println("-------------------------")
    //map的遍历
    // 通过 for range 遍历, 获取 key, value 值并打印
    for key, value := range citys {
        fmt.Printf("key: %s, value: %s\n", key, value)
    }

    fmt.Println("-------------------------")
    //只遍历值,也可以通过Go语言的匿名变量来实现
    for _, value := range citys {
        fmt.Printf("value: %s\n", value)
    }
    fmt.Println("-------------------------")
    //只遍历键
    for key := range citys {
        fmt.Printf("key: %s\n", key)
    }
}

运行结果:

map[010:北京 020:广州 021:上海 027:武汉 029:西安]
------------------------- 
key: 010, value: 北京     
key: 021, value: 上海     
key: 020, value: 广州     
key: 029, value: 西安     
key: 027, value: 武汉     
------------------------- 
value: 北京               
value: 上海               
value: 广州               
value: 西安               
value: 武汉               
------------------------- 
key: 021                  
key: 020                  
key: 029                  
key: 027                  
key: 010     

2.修改与删除

package main

import "fmt"

func main() {

    citys := map[string](string){
        "010": "北京",
        "021": "上海",
        "020": "广州",
        "029": "西安",
        "027": "武汉",
        "026": "null",
    }

    //map的遍历
    // 通过 for range 遍历, 获取 key, value 值并打印
    for key, value := range citys {
        fmt.Printf("key: %s, value: %s\n", key, value)
    }

    citys["026"] = "台北"
    fmt.Println("---------------------------------")
    for key, value := range citys {
        fmt.Printf("key: %s, value: %s\n", key, value)
    }

    delete(citys, "026")
    fmt.Println("---------------------------------")
    for key, value := range citys {
        fmt.Printf("key: %s, value: %s\n", key, value)
    }

}

运行结果:

key: 020, value: 广州
key: 029, value: 西安             
key: 027, value: 武汉             
key: 026, value: null             
key: 010, value: 北京             
key: 021, value: 上海             
--------------------------------- 
key: 026, value: 台北             
key: 010, value: 北京             
key: 021, value: 上海             
key: 020, value: 广州             
key: 029, value: 西安             
key: 027, value: 武汉             
--------------------------------- 
key: 010, value: 北京             
key: 021, value: 上海             
key: 020, value: 广州             
key: 029, value: 西安             
key: 027, value: 武汉    

3.并发Map使用sync.Map

Go语言的map在并发环境下,只读是线程安全的,同时读写是线程不安全的。Go 语言在1.9版本中提供了一种高效率的并发安全的sync.Map。

sync.Map 有以下特性:

package main

import (
    "fmt"
    "sync"
)

func main() {

    var m sync.Map

    // 添加一些键值对到 map 中
    m.Store("010", "北京")
    m.Store("021", "上海")
    m.Store("029", "西安")
    m.Store("026", "台北")

    // 从 sync.Map 中获取键为 029 的值
    fmt.Println(m.Load("029"))

    fmt.Println("------------------------")
    // 遍历 sync.Map 中的键值对
    m.Range(func(key, value interface{}) bool {
        fmt.Printf("key: %s, value: %s\n", key, value)
        return true
    })

    // 删除键值对
    m.Delete("026")

    fmt.Println("------------------------")
    // 遍历 sync.Map 中的键值对
    m.Range(func(key, value interface{}) bool {
        fmt.Printf("key: %s, value: %s\n", key, value)
        return true
    })

}

运行结果:

西安 true
------------------------ 
key: 010, value: 北京    
key: 021, value: 上海    
key: 029, value: 西安    
key: 026, value: 台北    
------------------------ 
key: 029, value: 西安    
key: 010, value: 北京    
key: 021, value: 上海