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)
}

 

posted @ 2018-12-09 15:12  小春熙子  阅读(340)  评论(0编辑  收藏  举报