zoukankan      html  css  js  c++  java
  • Go语言中的map(十一)

     map是一种无序的基于 key-value 的数据结构,Go语言中的map是引用类型,所以跟切片一样需要初始化才能使用。

     

    定义map

    定义 map 的语法如下:

    map[keyType]ValueType
    
    // keyType 键的类型
    // ValueType 键对应的值的类型

    定义 map 而不初始化时,默认值等于 nil,此时不能直接赋值的,如:

    func main() {
        var a map[string]int // 定义了map
        fmt.Println(a==nil) // true
        a["age"] = 100 // error 未初始化直接赋值,会报错
    }

    可以使用 make() 来给 map 分配内存,有了容量的 map 是可以操作的,格式如下:

    make(map[keyType]valueType,[cap])
    
    // 其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量。

    map 基本使用

     使用 make()定义map:

    func main() {
        myMap := make(map[string]int,3)
        fmt.Println(myMap) // map[]
        fmt.Println(myMap==nil) // false
        myMap["小明"] = 100
        fmt.Println(myMap) // map[小明:100]
        fmt.Println(myMap["小明"]) // 100
        fmt.Printf("Type:%T",myMap) // Type:map[string]int
    }

    你也可以直接在定义时填充元素:

    func main() {
        userInfo:=map[string]string{
            "username":"wj",
            "address":"中国",
        }
    
        fmt.Println(userInfo) // map[address:中国 username:wj]
        fmt.Printf("%#v",userInfo) // map[string]string{"address":"中国", "username":"wj"}
    
        // 占位符 "%#v" 输出对应值的Go语法表示
    }

    判断某个键是否存在

    Go语言中有个判断map中键是否存在的特殊写法,格式如下:

    value,ok := map[key]

    例子:

    func main() {
        userInfo:=map[string]string{
            "username":"wj",
            "address":"中国",
        }
    
        v,ok := userInfo["username"]
        if ok {
            fmt.Printf("有username这个key,其值为:%v",v)
        }else{
            fmt.Println("没有username这个key")
        }
    }

    遍历map

    使用 for range 来遍历 map:

    func main() {
        ageMap:=make(map[string]int,3)
        ageMap["小明"] = 18
        ageMap["小红"] = 15
        ageMap["小军"] = 16
    
        for k,v:=range ageMap{
            fmt.Println(k,v)
        }
    }
    
    // 小明 18
    // 小红 15
    // 小军 16

    有时如果只想遍历key,我们可以这样写:

    for k:_=range ageMap{
        fmt.Println(k)
    }

    但在遍历map时,如果只想要遍历key,可以省略_,直接这样写:  

    for k:=range ageMap{
        fmt.Println(k)
    }

    需要注意的是,遍历map时的元素顺序与添加键值对的顺序无关。

    使用 delete() 函数删除键值对

    使用内建函数 delete() 删除map中的一组键值对,语法格式:

    delete(map,key)

    例子:

    func main() {
        ageMap:=make(map[string]int,3)
        ageMap["小明"] = 18
        ageMap["小红"] = 15
        ageMap["小军"] = 16
        delete(ageMap,"小红") // 将 小红:15 删除
        for v,k:=range ageMap{
            fmt.Println(v,k)
        }
    }
    
    // 小明 18
    // 小军 16

    元素为map类型的切片

    func main() {
        var mapSlice = make([]map[string]string,3) // 定义值类型为map的切片,容量为3
        for i,v:=range mapSlice{
            fmt.Println(i,v)
        }
        // mapSlice[0]["username"] = "wj" // error,直接操作切片的map元素会报错
    
        mapSlice[0] = make(map[string]string,3) // 对切片中的 map元素 进行初始化
        mapSlice[0]["username"] = "wj"
        mapSlice[0]["address"] = "中国"
        for i,v:=range mapSlice{
            fmt.Println(i,v)
        }
    }
    
    
    // 0 map[]
    // 1 map[]
    // 2 map[]
    // 0 map[address:中国 username:wj]
    // 1 map[]
    // 2 map[]

    值为切片类型的map

    func main() {
        var sliceMap = make(map[string][]string,3) // 定义值为切片类型的map
        fmt.Println(sliceMap)
        sliceMap["address"] = []string{"北京","上海"}
        fmt.Println(sliceMap)
    }
    
    // map[]
    // map[address:[北京 上海]]
  • 相关阅读:
    ActiveMQ 5.x 消息队列
    Spring Boot 整合 ElasticSearch 框架
    Spring Boot 整合 Logback 日志框架
    Spring Boot 整合定时任务和异步任务处理
    Spring 中使用 Java 5.0 Executor
    二级指针三种内存模型综合训练
    08-图8 How Long Does It Take (25 分)
    08-图9 关键活动 (30 分)
    08-图7 公路村村通 (30 分)
    C函数之index、strtoul
  • 原文地址:https://www.cnblogs.com/wjaaron/p/11749343.html
Copyright © 2011-2022 走看看