go Map

Map是一种无序键值对形式的数据类型

{key1:value1, key2:value2, key3:value3, ...}

Map 是无序的,我们无法决定它的返回顺序, 因为它是由Hash实现的

通过map的key可以获取对应的值

 

定义Map(2种方式):

1.通过内建函数make

var v_map  = make(map[key_type]value_type)    // 数据类型为: map[key_type]value_type

2.通过初始化定义map

m := map[string]string {

        "a": "abc",            

        "b": "bca",               // 每行的末尾须要加上逗号, 才能通过编译

}

直接写作: var m map[string]string, 是不能使用的, 因为没有开辟空间

必须要像上面两种方式 m["A"] = "abc", 这样是错误的操作

 

向Map中存放键值对

var cmap  = make(map[string]string)     // 创建Map, 变量为cmap

cmap ["China"] = "中国"                        // 向cmap中添加键值对

cmap ["America"] = "美国"

 

for循环遍历Map

for k, v := range cmap {

       fmt.Print(v)

}

大部份的数据类型都可以做为map的键和值

如下是map的value类型为一个map:

func main() {
    a := make(map[string]map[string]string, 10)
    a["A"] = make(map[string]string)        
    a["A"]["1"] = "A1"                // a["A"] 是一个map, 所以可写作a["A"]key = value
    a["A"]["2"] = "A2"
    fmt.Println(a)		    // map[A:map[1:A1 2:A2]]
}

查看map中是否存在某元素

val, flag := map[key], 如果有该元素, 则flag为真, 否则为假

func main() {
    m := make(map[string]map[string]string)		// map作为信息存储单元
	
    m["zhangsan"] = make(map[string]string)		// 插入一个信息
    m["zhangsan"]["nikename"] = "xiaozhang"		// 具体信息
    m["zhangsan"]["password"] = "111111111"
    m["zhangsan"]["birthday"] = "222222222"

    modify("zhangsan", m)
    fmt.Println(m)		// map[zhangsan:map[nikename:xxxxxx password:123456 birthday:222222222]]
}

/*更改用户信息, 若不存在该用户, 则创建*/
func modify(user string, info map[string]map[string]string) {
    val, ok := info[user]	   // 获取user, 如果没有获取到, 则ok为false
    if !ok {                        // 也可以使用 if (info[user] == nil) {...}
        info[user] = make(map[string]string)	// 如果没有获取到该user, 创建它
    }

    // 赋值或更改信息
    val["password"] = "123456"
    val["nikename"] = "xxxxxx"
}

map可以删除元素

delete(cmap, c_key)

如果要清空map中的所有元素, 则for循环一个个删除元素

没有直接清空map元素的函数

len(map)求元素个数

func main() {
    cmap := map[string]string{"a":"A", "b":"B", "c":"C"}
    for _, v := range cmap {
        fmt.Println(v)
    }
    delete(cmap, "c")
    fmt.Println(cmap)			// map[a:A b:B]
    fmt.Println(len(cmap))		// 2
}

切片与map结合

无论是切片还是map, 在使用前都必须初始化, 否则panic

如果没有初始化, 则它就是nil, 因此在使用前, 通常会通过nil来判断它

func main() {
    sli := make([]map[int]string, 3)

    if sli[0] == nil {                    // 用切片或map前通常使用nil判断是否初始化
        sli[0] = make(map[int]string)
    }
    sli[0][1] = "俄罗斯"
    sli[0][2] = "加拿大"
    sli[0][3] = "中国"

    if sli[1] == nil {                   
        sli[1] = make(map[int]string)
    }
    sli[1][97] = "a"
    sli[1][98] = "b"
    sli[1][99] = "c"

    fmt.Println(sli)  // [map[1:俄罗斯 2:加拿大 3:中国] map[97:a 98:b 99:c] map[]]
}

// 从结果来看, 该切片中前两个初始化了, 但第三个是空的, 因为它没有安初始化

 

map是无序的

但是可以排序map的键, 再根据键得到值

func main() {
    m := make(map[int]int)
    m[1] = 4
    m[2] = 8
    m[0] = 5
    m[9] = 0
    m[3] = 3

    var keys []int                // 用切片储存map的key, 便于排序
    for k, _ := range m {
        keys = append(keys, k)
    }

    sort.Ints(keys)                // 调用函数给切片排序排序

    for _, v := range keys {        // 循环切片, 即循环map的key
        fmt.Println(v, m[v])
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值