Golang中的map的使用
来源:互联网 发布:centos启用无线网卡 编辑:程序博客网 时间:2024/06/16 12:41
map创建创建
1) make(map[KeyType]ValueType, initialCapacity)2) make(map[KeyType]ValueType)3) map[KeyType]ValueType{}4) map[KeyType]ValueType{key1 : value1, key2 : value2, ... , keyN : valueN}
用4种方式分别创建数组,其中第一种和第二种的区别在于,有没有指定初始容量,不过使用的时候则无需在意这些,因为map的本质决定了,一旦容量不够,它会自动扩容。
func test1() { map1 := make(map[string]string, 5) map2 := make(map[string]string) map3 := map[string]string{} map4 := map[string]string{"a": "1", "b": "2", "c": "3"} fmt.Println(map1, map2, map3, map4)}
输出 :
map[] map[] map[] map[c:3 a:1 b:2]
注意,必须要先初始化才能给map赋值设置元素,不然会引起 panic: assign to entry in nil map。
代码测试:
package mainimport( "fmt")func main(){ ages01 := map[string]int{ "alice":31, "bob":13, } ages02 := make(map[string]int) ages02["chris"] =20 ages02["paul"] = 30 //age01和age02两种初始化的方式等价 m1 := make(map[string]int) m2 := map[string]int{} //m1和m2创建方式等价,都是创建了一个空的的map,这个时候m1和m2没有任何元素 for name,age := range ages01{ fmt.Printf("%s\t%d\n",name,age) } for name,age := range ages02{ fmt.Printf("%s\t%d\n",name,age) } var null_map map[string]int //声明但未初始化map,此时是map的零值状态(只有一个nil元素) empty_map := map[string]int{} //创建了初始化了一个空的的map,这个时候empty_map没有任何元素 fmt.Println(m1 != nil && m2 != nil) //true fmt.Println(len(null_map)==0) fmt.Println(null_map ==nil) //true,此时是map的零值状态(nil) fmt.Println(len(empty_map)==0) fmt.Println(empty_map ==nil) //false,空的的map不等价于nil(map的零值状态) empty_map["test"] = 12 //执行正常,空的的map可以赋值设置元素 null_map["test"] = 12 //panic: assignment to entry in nil map,无法给未初始化的map赋值设置元素}
输出:
alice 31bob 13chris 20paul 30truetruetruetruefalsepanic: assignment to entry in nil map
元素的增删改查
首先增和改没什么区别,只需要map[K]=V即可。
删除的话使用内置函数delete 来从字典中根据键来删除一个元素。
查找一个元素用下面的代码段:
if _, ok := map[key]; ok { //存在 }
关于这里的根据键值索引map元素,这里多说两句。
golang中的函数可以多值返回,比如下面函数,既能返回两数之差,又能返回两数之积。
package mainimport( "fmt")func multi_return(a,b int)(int,int){ return a-b,a*b}func main(){ a,b := multi_return(6,3) fmt.Printf("差是%d,积是%d\n",a,b)}
类似的,在你根据键值索引某个元素时,也会返回两个值:索引到的值和本次索引是否成功(这里可能会因为索数值越界或者索引键值有误而导致索引失败)。
代码如下:
package mainimport( "fmt")func main(){ ages01 := map[string]int{ "alice":31, "bob":13, } age,ok := ages01["bo"] //age才是根据键值索引到的值 if !ok{ fmt.Printf("索引失败,bo不是map的键值,此时age=%d",age) //索引失败会返回value的零值,这里是int类型,所以是0 } else{ fmt.Printf("索引成功,age=%d",age) }}
map不能比较
Golang中map和slice,func一样,不支持 == 操作符,就是不能直接比较。唯一合法的就是和nil作比较,判断该map是不是零值状态。
当然,可以自定义实现一个map之间的比较:
package mainimport( "fmt")func equal(m1,m2 map[string]int) bool{ if(len(m1)!=len(m2)){ return false } for k,xv :=range m1{ if yv,ok:= m2[k];!ok || yv!=xv{ return false } } return true}func main(){ map01 := make(map[string]int) map01["aa"] = 1 map01["bb"] = 2 map02 := map[string]int {"aa":1,"bb":2} fmt.Println(equal(map01,map02))}
阅读全文
0 0
- Golang中的map的使用
- golang中的map
- golang map使用
- golang map的遍历
- golang 中的 slice array map
- Golang 中使用多维 map
- golang语言中map的初始化及使用
- golang语言中map的初始化及使用
- golang语言中map的初始化及使用
- golang语言中map的初始化及使用:代码示例
- golang语言中map的初始化及使用
- golang map的判断,删除
- golang中map的坑
- goLang map 的简单应用
- 【golang】golang redis 的使用
- golang Map
- golang-Map
- [Golang]Map的一个绝妙特性
- JAVA设计模式之单例模式
- mysql添加,删除约束,修改各种constraint
- Groovy入门教程
- 软件密钥汇总
- 数组,递归
- Golang中的map的使用
- 颠覆三观的一课
- Verilog设计作业
- 初学java:打印出1000以内的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。
- docker镜像操作
- dedecms 出现413 Request Entity Too Large解决方法
- HTTP keep-alive详解
- CodeForces 333A Secrets
- 渲染管道相关文章