zoukankan      html  css  js  c++  java
  • 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)
    }

  • 相关阅读:
    第六章_编写定制标签
    C递归算法与栈的分析,非全然二叉树遍历分析---ShinePans
    Linux面试必问-对照目录内容的命令“Diff”具体解释
    微信公众平台开发(73) 客服接口发送客服消息
    微信公众平台开发(94) 违章查询
    微信支付类目及费率
    微信公众平台开发入门教程(三)消息类型讲解
    微信公众平台开发入门教程(二)启用开发模式
    微信公众平台开发入门教程(四)获取接收消息
    微信公众平台开发调试方法
  • 原文地址:https://www.cnblogs.com/hqutcy/p/10054059.html
Copyright © 2011-2022 走看看