Go语言基础 – map

  • A+
所属分类:go语言编程 学编程

1.map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。

2.map声明时不会分配内存地址,需要初始化后才会分配内存地址,初始化用make

map

map定义与初始化示例

func mapDemo() {

    // 方法一、先定义map,然后make初始化map,最后赋值
    // var a map[string]string      // 声明名为a的map (支持简写,:= 的方式)
    // a = make(map[string]string,10)     // 初始化a,长度等于10
    // a["name"] = "dream"      // 赋值操作
    // a["age"] = "18"

    // 方法二、通过推导的方式直接make初始化,然后赋值
    // a := make(map[string]string,10)     // 定义与初始化a,长度等于10
    // a["name"] = "dream"      // 赋值操作
    // a["age"] = "18"

    // 方法三、定义与赋值一起操作了(// map[key的类型]value类型)
    var a map[string]string = map[string]string{
        "name": "dream",
        "age": "18",
    }
    fmt.Println(a)      // 结果为:map[age:18 name:dream]
}

判断map里的某个键是否存在

func main() {
    scoreMap := make(map[string]int)
    scoreMap["张三"] = 90
    scoreMap["小明"] = 100
    // 如果key存在ok为true,v为对应的值;不存在ok为false,v为值类型的零值
    v, ok := scoreMap["张三"]
    if ok {
        fmt.Println(v)
    } else {
        fmt.Println("查无此人")
    }
}

key的值为map类型的map使用与map的增删改查功能

func testMap2() {
    a := make(map[string]map[string]string, 10)      // 定义与初始化一个值为map的map
    a["person_obj"] = make(map[string]string)         // 初始化值的map(由于值类型是map,需要先初始化值得map,如果不初始化调用就会报错)

    // 往map里插入数据
    a["person_obj"]["name"] = "dream"              // 赋值操作(插入数据)
    a["person_obj"]["age"] = "22"
    a["person_obj"]["salary"] = "20000"
    fmt.Println(a)        // 查看最终结果

    // 从map里获取数据
    k, v := a["person_obj"]          // 获取数据
    if v {
        fmt.Println(k)     // 结果为:map[age:22 name:dream salary:20000]
        fmt.Println(k["name"])    // 结果为:dream
    }
    fmt.Println(v)     // 结果为:true

    // 删除map里的数据(如果要清空一个map只能for循环一个一个的删,或者重新make一下)
    delete(a["person_obj"], "salary")
    fmt.Println(a)

    // 遍历map(map的值是map时需要使用两个循环)
    for k, v := range a {
        fmt.Println(k)
        for k1, v1 := range v {
            fmt.Println(k1,v1)
        }
     }

    // 打印map的长度
    fmt.Println(len(a))

    // 更新操作
    a["person_obj"]["age"] = "23"
    fmt.Println(a)
}

map里值为操作类型的操作

func mapDemo2() {
    var sliceMap = make(map[string][]string, 3)    // 初始化一个map[字符串类型]切片类型
    fmt.Println(sliceMap)     // 结果:map[]
    key := "中国"
    value, ok := sliceMap[key]
    if !ok {    // 如果map里不存在value这个值
        value = make([]string, 0, 2)    // 初始化map里的切片并赋值给value
    }
    value = append(value, "北京", "上海")    // 使用append()函数往value切片里追加:"北京", "上海" 两个值
    sliceMap[key] = value     // 给sliceMap 赋值,[中国] = "北京", "上海"
    fmt.Println(sliceMap)     // 结果为:map[中国:[北京 上海]]
}

切片里的元素是map的操作

func mapDemo1() {
    var mapSlice = make([]map[string]string, 3)    // 初始化切片,mapSlice[0]为map
    fmt.Println(mapSlice)    // 结果为:[map[] map[] map[]]

    // 对切片中的map元素进行初始化
    mapSlice[0] = make(map[string]string, 10)       // 初始化切片的第一个元素(也就是map)
    mapSlice[0]["name"] = "小王子"        // 给切片的第一个元素(map)赋值
    mapSlice[0]["password"] = "123456"
    mapSlice[0]["address"] = "沙河"
    fmt.Println(mapSlice)          // 结果为:[map[address:沙河 name:小王子 password:123456] map[] map[]]
    for index, value := range mapSlice {
        fmt.Printf("index:%d value:%v\n", index, value)
    }
}

map反转:mapA的键是mapb的值,mapA的值是mapB的键

func mapRevert() {
    a := make(map[string]int,5)           // 定义并初始化两个map
    b := make(map[int]string,5)

    a["abc"] = 135        // 给a map赋值
    a["def"] = 246
    fmt.Println("map a:",a)

    for k, v := range a {      // 循环a map
        b[v] = k      // 给b map赋值,b的键等是a的值、值是a的键
    }
    fmt.Println("map b:",b)    // 打印结果

}

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: