zoukankan      html  css  js  c++  java
  • 【go语言学习】映射map

    Go语言中的map(映射、字典)是一种内置的数据结构,它是一个无序的key-value对的集合。
    Go语言中的map是引用类型,必须初始化才能使用。

    一、map的定义和初始化

    go语言中map声明的语法:

    var m = map[keyType]valueType
    其中:keyType-键key的类型
               valueType-值value的类型

    package main
    
    import "fmt"
    
    func main() {
    	var m map[int]string
    	fmt.Println(m)
    	fmt.Println(m == nil)
    	m[1] = "tom"
    	fmt.Println(m)
    }
    

    运行结果

    map[]
    true
    panic: assignment to entry in nil map
    
    goroutine 1 [running]:
    main.main()
            E:/golang/go_project/main.go:9 +0x107
    exit status 2
    

    但这样声明的map的初始值为nil,是不能存放键值对,需要使用make()函数类分配内存。

    m = make(map[keyType]valueType, [cap])
    其中:cap-表示map的容量,非必须,但建议初始化时指定一个合适的容量。

    package main
    
    import "fmt"
    
    func main() {
    	var m map[int]string
    	m = make(map[int]string, 10)
    	fmt.Println(m)
    	fmt.Println(m == nil)
    	m[1] = "tom"
    	fmt.Println(m)
    }
    

    运行结果

    map[]
    false
    map[1:tom]
    

    也可以直接声明和赋值

    var m = map[keyType]valueType {
               key: value,
               key: value,
               }

    package main
    
    import "fmt"
    
    func main() {
    	m := map[int]string{
    		1: "tom",
    		2: "jack",
    	}
    	fmt.Println(m)
    }
    

    运行结果

    map[1:tom 2:jack]
    

    二、map的操作

    1、添加

    map[key] = value

    注意:

    • map里所有key的数据类型必须是相同的,value的数据类型也必须相同,但key和value的数据类型可以不相同
    • map里key可以是所有可比较的类型,如布尔型、整数型、浮点型、复杂型、字符串型等
    • map里key是唯一的,后添加的key-value,会覆盖前面的key-value
    package main
    
    import "fmt"
    
    func main() {
    	m := make(map[int]string, 10)
    	m[1] = "tom"
    	m[2] = "jack"
    	fmt.Println(m)
    	m[1] = "lili"
    	fmt.Println(m)
    }
    

    运行结果

    map[1:tom 2:jack]
    map[1:lili 2:jack]
    
    2、取值

    map[key] 可以获得key对应的value值

    但是当key如果不存在的时候,我们会得到该value值类型的默认值,比如string类型得到空字符串,int类型得到0。但是程序不会报错。

    所以我们可以使用ok-idiom获取值,可知道key/value是否存在

    value, ok := map[key]

    package main
    
    import "fmt"
    
    func main() {
    	m := make(map[int]string, 10)
    	m = map[int]string{
    		1: "tom",
    		2: "jack",
    	}
    	fmt.Println(m[3]) // 返回string的默认值""
    	v, ok := m[3]
    	if ok {
    		fmt.Println("3-", v)
    	} else {
    		fmt.Println("查无此人!")
    	}
    }
    

    运行结果

    
    查无此人!
    
    3、删除

    使用delete()内建函数从map中删除一组键值对,如果key存在则删除,如果key不存在则不做任何操作也不报错

    delete(map, key)
    其中:map-表示要删除键值对的map
               key-表示要删除的键值对的键

    package main
    
    import "fmt"
    
    func main() {
    	m := make(map[int]string, 10)
    	m = map[int]string{
    		1: "tom",
    		2: "jack",
    	}
    	delete(m, 2)
    	delete(m, 3)
    	fmt.Println(m)
    }
    

    运行结果

    map[1:tom]
    
    4、遍历

    go语言中使用for range遍历map,遍历的结果是无序的。

    package main
    
    import "fmt"
    
    func main() {
    	m := make(map[int]string, 10)
    	m = map[int]string{
    		1: "tom",
    		2: "jack",
    		3: "lili",
    		4: "marry",
    	}
    	for k, v := range m {
    		fmt.Printf("%v-%v	", k, v)
    	}
    }
    

    运行结果

    3-lili  4-marry 1-tom   2-jack
    
    5、map的长度

    len(map)可以获取map的长度

    两个map也是不能进行比较的,map唯一可以合法比较的对象是nil map can only be compared to nil, 应该用len(map) == 0来判断map是否为空

    三、map的注意事项

    1、map是引用类型

    go语言中和切片一样,map也是引用数据类型,赋值和传参都是浅拷贝,传递的是map的地址。它们都指向相同的内部数据结构,因此,一个的变化会反映到另一个。

    package main
    
    import "fmt"
    
    func main() {
    	m := make(map[int]string, 10)
    	m = map[int]string{
    		1: "tom",
    		2: "jack",
    		3: "lili",
    		4: "marry",
    	}
    	m2 := m
    	m2[2] = "小小强"
    	fmt.Println(m)  //map[1:tom 2:小小强 3:lili 4:marry]
    	fmt.Println(m2) //map[1:tom 2:小小强 3:lili 4:marry]
    	test(m)
    	fmt.Println(m) //map[1:小强 2:小小强 3:lili 4:marry]
    }
    
    func test(m map[int]string) {
    	m[1] = "小强"
    }
    

    运行结果

    map[1:tom 2:小小强 3:lili 4:marry]
    map[1:tom 2:小小强 3:lili 4:marry]
    map[1:小强 2:小小强 3:lili 4:marry]
    
    2、map&slice

    map和slice结合使用,可以是

    • slice的元素为一个map类型
    package main
    
    import "fmt"
    
    func main() {
    	m1 := make(map[string]string, 2)
    	m1 = map[string]string{
    		"name":    "tom",
    		"address": "上海市",
    	}
    	m2 := make(map[string]string, 4)
    	m2 = map[string]string{
    		"name":    "jack",
    		"address": "北京市",
    	}
    	m3 := make(map[string]string, 6)
    	m3 = map[string]string{
    		"name":    "marry",
    		"address": "苏州市",
    	}
    	s := make([]map[string]string, 3, 10)
    	s = []map[string]string{m1, m2, m3}
    	fmt.Println(s)
    	for k1, v1 := range s {
    		fmt.Printf("第%v个人信息:
    ", k1+1)
    		for k2, v2 := range v1 {
    			fmt.Printf("	%v:%v
    ", k2, v2)
    		}
    	}
    }
    

    运行结果

    [map[address:上海市 name:tom] map[address:北京市 name:jack] map[address:苏州市 name:marry]]
    第1个人信息:
            name:tom
            address:上海市
    第2个人信息:
            name:jack
            address:北京市
    第3个人信息:
            address:苏州市
            name:marry
    
    • map的value为一个slice类型
    package main
    
    import "fmt"
    
    func main() {
    	m := make(map[string][]int, 2)
    	m = map[string][]int{
    		"tom":  []int{80, 98, 95},
    		"jack": []int{94, 87, 91},
    	}
    	fmt.Println(m)
    }
    

    运行结果

    map[jack:[94 87 91] tom:[80 98 95]]
    
  • 相关阅读:
    OpenStack安装及监控配置视频教程
    具有可视化的功能的一款开源软件Gource
    Ubuntu 12.04使用演示
    VisualRoute for Mac OS 体验
    P1006-传纸条
    Leetcode-1157 Online Majority Element In Subarray(子数组中占绝大多数的元素)
    Leetcode-1156 Swap For Maximum Repeated Substring(单字符重复子串的最大长度)
    Leetcode-1155 Number of Dice Rolls With Target Sum(掷骰子的N种方法)
    Leetcode-1154 Ordinal Number Of Date(一年中的第几天)
    P1508-Likecloud-吃、吃、吃
  • 原文地址:https://www.cnblogs.com/everydawn/p/13892958.html
Copyright © 2011-2022 走看看