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:[北京 上海]]

 

posted @ 2019-10-28 10:10  黑色瓶子  阅读(218)  评论(0编辑  收藏  举报