Go语言之map
一、map简介
map是key-value的数据结构,基本语法:var map 变量名 map[keytype]valuetype。
keytype可以是很多种数据类型,比如 bool、int、string、指针等,通常keytype为int和string。valuetype和keytype差不多,通常valuetype为int、string、map、struct。
举例:
var a map[int]string // key是int类型,value是string类型 var a map[string]int // key是string类型,value是int类型 var a map[string]string // key是string类型,value是string类型 var a map[string]map[string]string // key是string类型,value是map类型
注意:声明是不会分配内存,初始化需要make,分配内存后才能赋值和使用。
package main import "fmt" func main() { // 声明map var a map[string]string // 在使用map前需要使用make分配空间 a = make(map[string]string, 10) a["username"] = "张三" a["addr"] = "张家界" fmt.Println(a) // map[addr:张家界 username:张三] }
- map在使用前一定要make
- map的key是不能重复的,如果重复了,以最后一个key-value为准
- map的value可以重复
- map的key-value是无序的
二、map的创建
1、方式一
package main import "fmt" func main() { // 创建map的方式一 先进行make var m1 map[string]string m1 = make(map[string]string, 10) m1["usernamae"] = "张三" m1["password"] = "abc123456" fmt.Println(m1) }
2、方式二
package main import "fmt" func main() { // 创建map的方式二 m2 := make(map[string]string) m2["usernamae"] = "张三" m2["password"] = "abc123456" fmt.Println(m2) }
3、方式三
package main import "fmt" func main() { // 创建map的方式三 m3 := map[string]string{ "username": "张三", "password": "abc123", } fmt.Println(m3) }
三、map的增、删、查、改
1、增加和修改
package main import "fmt" func main() { user := map[string]string{ "username": "iveBoy", } // 增加,如果key没有,就是增加 user["password"] = "abc123456" // 修改,如果key存在,就是修改 user["username"] = "lily" fmt.Println(user) }
2、删除
delete(map, "key"),delete是一个内置函数,如果key存在,就删除该key-value,如果key不存在,不操作并且也不会报错。
package main import "fmt" func main() { user := map[string]string{ "username": "iveBoy", "gender": "male", } // 删除键值 delete(user, "gender") fmt.Println(user) // map[username:iveBoy] // 删除不存在的键, 删除不操作,也不会报错 delete(user, "hobby") fmt.Println(user) }
如果需要清空整个map,通过:
- 循环一个个删除
- make一个新的map,让之前的那个成为垃圾,gc进行回收
3、查找
package main import "fmt" func main() { user := map[string]string{ "username": "iveBoy", "gender": "male", } val, isFlag := user["username"] fmt.Println(val, isFlag) // iveBoy true }
如果user中存在username这个键,isFlag就是true,否则就为false。
对于map的遍历:
package main import "fmt" func main() { // 声明一个map user := map[string]string{ "username": "iveBoy", "gender": "male", } for k, v := range user { fmt.Printf("k=%v v=%v\n", k, v) } /* k=username v=iveBoy k=gender v=male */ }
如果计算map的长度可以通过len方法进行获取,len(user)。
四、map切片
之前学习过数组切片,那么map切片应该就知道是什么意思了,对的,通过map切片可以使map的个数动态变化。举个例子,一个班级有很多学生,而每个学生有自己的姓名、性别等信息,那么班级可以定义成一个切片,每个学生就是一个map。
package main import "fmt" func main() { // 定义切片 class := make([]map[string]string, 2) //可以放入2个学生信息 // 增加第一个学生,先提前判断是否存在这个map if class[0] == nil { class[0] = make(map[string]string) class[0]["name"] = "张三" class[0]["gender"] = "男" } // 增加第二个学生,先提前判断是否存在这个map if class[1] == nil { class[1] = make(map[string]string) class[1]["name"] = "李四" class[1]["gender"] = "男" } // 此时只能动态添加map了,否则会越界 newStu1 := map[string]string{ "name": "王五", "gender": "男", } class = append(class, newStu1) fmt.Println(class) /* [map[gender:男 name:张三] map[gender:男 name:李四] map[gender:男 name:王五]] */ }
五、map其它注意事项
1、map排序
golang中没有专门的方法针对map的key进行排序,所以map是无序的,如果想让其有序可以先将map的key放入切片中进行排序,然后对应输出对应的value。
package main import ( "fmt" "sort" ) func main() { m1 := make(map[int]int, 5) m1[1] = 5 m1[3] = 10 m1[0] = 60 // 定义一个切片 var keys []int for k, _ := range m1{ keys = append(keys, k) } // 对key进行排序 sort.Ints(keys) fmt.Println(keys) // 根据key输出value for _, k := range keys{ fmt.Println("value=", m1[k]) } }
2、map引用类型
map是引用类型,如果函数参数是map类型,那么在函数里面修改的map,外面也会发生变化。
package main import "fmt" func modifyValue(m map[int]int) { m[1] = 10 } func main() { m2 := map[int]int{ 1: 6, 2: 9, } // 修改map值 modifyValue(m2) fmt.Println(m2) /* map[1:10 2:9] */ }
作者:iveBoy
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。