Go编程基础之六
1.map
----类似其他语言中的哈希表或字典,以key-value形式存储数据
----Key必须是支持==或 != 比较运算的类型,不可以是函数,map或slice;但是value的值支持所有类型;
----Map查找比线性搜索快得多,但比使用索引访问数据的类型慢100倍;
----所以,尽量使用array或者slice这种可以使用索引访问数据的类型;
----Map使用make()创建,支持:= 这种简写方式;
(1)一般形式创建map-----map的初始化:
func main(){ var m map[int]string //key的类型为int,value的类型为string m = map[int]string{} fmt.Println(m) }
(2)其他形式对map进行初始化:
func main(){ var m map[int]string = map[int]string{} //key的类型为int,value的类型为string; //var 变量名 变量类型 = 变量初始化 m2 := map[int]string{} //简写,注意不要缺失大括号 fmt.Println(m,m2) }
(3)map类型的使用:存储数据与读取数据
func main(){ m := make(map[int]string) //简写,注意没有大括号 m[1] = "OK" a := m[1] //读取map中的数据到变量a fmt.Println(m,a) }
----make([key Type]valueType ,cap) cap表示容量,可省略
----超出容量时会自动扩容,但尽量提供一个合理的初始值
----使用len()获取元素个数、
----键值对不存在时自动添加,使用delete()删除某键值对
(4)使用delete函数删除,键值对:
func main(){
m := make(map[int]string) //简写,注意不要缺失大括号
m[1] = "OK"
delete(m,1) //删除map中的key为1的value值
a := m[1] //读取map中的数据到变量a
fmt.Println(m,a)
}
(5)复杂map的使用:map中嵌套map
func main(){ m := make(map[int]map[int]string) //这里的make只是将最外层的map进行了初始化 m[1] = make(map[int]string) //对里层的map进行初始化 m[1][1] = "OK" a := m[1][1] //读取map中的数据到变量a fmt.Println(m,a) }
(6)每一级的map都要进行单独的初始化:
func main(){ m := make(map[int]map[int]string) //这里的make只是将最外层的map进行了初始化 a,ok := m[2][1] //利用多返回值,第二个返回值是布尔类型的,它会告诉你见值对是否存在 if !ok { m[2] = make(map[int]string) //每一级的,map都要进行单独的初始化 } m[2][1] = "GOOD" a,ok = m[2][1] fmt.Println(a,ok) }
----使用 for range 对map和slice进行迭代操作
func main(){ for i,v:=range slice{ //对slice进行迭代,会返回两个值,第一个值就是slice的索引,第二个值是slice索引对应的值 //i就相当于一个计算器,它的类型是int型;v就是slice中存储的值,取出这个值赋值给v,v是slice中值的拷贝 //对v的任何修改都不会影响到slice本身 } for k,v:=range map{ //返回键值对,对键值对的任何操作都是对拷贝的操作,不会对键值对本身产生任何影响 } }
举例:
(1)对v进行操作不影响本身的slice,因为v只是slice中值的拷贝
func main(){ sm := make([]map[int]string,5) //以map为元素类型的slice,slice的长度为5 for _,v:=range sm{ //不需要用到索引i,所以用_ 代替 v = make(map[int]string,1) //对map进行初始化,注意不是使用:,而是直接使用 = v[1] = "OK" fmt.Println(v) } fmt.Println(sm) //对v的任何操作都不会影响到slice本身,所以for中的赋值对原本的slice没有影响 }
(2)对i进行操作,直接改变原本slice中的值:
func main(){ sm := make([]map[int]string,5) //以map为元素类型的slice,slice的长度为5 for i:=range sm{ sm[i] = make(map[int]string, 1) //直接用i进行操作,改变了slice中元素的值,在迭代中进行初始化 sm[i][1] = "OK" fmt.Println(sm[i]) } fmt.Println(sm) }
(3)对map进行间接排序:
func main(){ m := map[int]string{1:"a",2:"b",3:"c",4:"d",5:"e"} s := make([]int,len(m)) //初始化一个slice i := 0 //定义一个变量i作为迭代的计数器 for k,_:=range m{ //对map进行一个迭代 s[i] = k i++ }//将map中所有的k都存到slice中 fmt.Println(s) //每次打印的值都不一样,这就是map的无序性 }
进行【排序】:导入sort包
package main import ( "fmt" "sort" ) func main(){ m := map[int]string{1:"a",2:"b",3:"c",4:"d",5:"e"} s := make([]int,len(m)) //初始化一个slice i := 0 //定义一个变量i作为迭代的计数器 for k,_:=range m{ //对map进行一个迭代 s[i] = k i++ }//将map中所有的k都存到slice中 sort.Ints(s) fmt.Println(s) }
有些人之所以不断成长,就绝对是有一种坚持下去的力量。好读书,肯下功夫,不仅读,还做笔记。人要成长,必有原因,背后的努力与积累一定数倍于普通人。所以,关键还在于自己。