zoukankan      html  css  js  c++  java
  • Golang-map、map切片

    Golang-map

      map 的基本介绍

        map 是 key-value 数据结构,又称为字段或者关联数组。类似其它编程语言的集合,在编程中是经常使用到


      map 的声明

        var map 变量名 map[keytype]valuetype

        key 可以是什么类型
        golang 中的 map,的 key 可以是很多种类型,比如 bool, 数字,string, 指针, channel , 还可以是只包含前面几个类型的 接口, 结构体, 数组
        通 常 key 为 int 、 string
        注意: slice, map 还有 function 不可以,因为这几个没法用 == 来判断

        valuetype 可以是什么类型
        valuetype 的类型和 key 基本一样,这里我就不再赘述了通常为: 数字(整数,浮点数),string,map,struct


      map 声明的举例:
        var a map[string]string

        var a map[string]int

        var a map[int]string
        var a map[string]map[string]string
        注意:声明是不会分配内存的,初始化需要 make ,分配内存后才能赋值和使用。案例演示:

                 

          对上面代码的说明
          1)map 在使用前一定要 make
          2)map 的 key 是不能重复,如果重复了,则以最后这个 key-value 为准
          3)map 的 value 是可以相同的.
          4)map 的 key-value 是无序
          5)make 内置函数数目

            

       map 的使用

        方式一

          

         方式二

          

         方式三

          

       

      map 使用的课堂案例
        课堂练习:演示一个 key-value 的 value 是 map 的案例
        比如:我们要存放 3 个学生信息, 每个学生有 name 和 sex 信息思路: map[string]map[string]string
        代码:

          

       

      map 的增删改查操作
        map 增加和更新:
          map["key"] = value //如果 key 还没有,就是增加,如果 key 存在就是修改。

          

         

        map 删除: 说明:
          delete(map,"key") ,delete 是一个内置函数,如果 key 存在,就删除该 key-value,如果 key 不存在, 不操作,但是也不会报错

            

           

          细节说明
          如果我们要删除 map 的所有 key ,没有一个专门的方法一次删除,可以遍历一下 key, 逐个删除或者 map = make(...),make 一个新的,让原来的成为垃圾,被 gc 回收

          

         map 查找: 案例演示:

          

          对上面代码的说明:
          说明:如果 heroes 这个 map 中存在 "no1" , 那么 findRes 就会返回 true,否则返回 false

      

      map 遍历:
        案例演示相对复杂的 map 遍历:该 map 的 value 又是一个 map
        说明:map 的遍历使用 for-range 的结构遍历

           

       

      map 的长度

        

    map 切片

      基本介绍
        切片的数据类型如果是 map,则我们称为 slice of map,map 切片,这样使用则 map 个数就可以动态变化了。
      案例演示
        要求:使用一个 map 来记录 monster 的信息 name 和 age, 也就是说一个 monster 对应一个 map,并且妖怪的个数可以动态的增加=>map 切片

        

       

     map 排序
      1)golang 中没有一个专门的方法针对 map 的 key 进行排序
      2)golang 中的 map 默认是无序的,注意也不是按照添加的顺序存放的,你每次遍历,得到的输出可能不一样. 【案例演示 1】
      3)golang 中 map 的排序,是先将 key 进行排序,然后根据 key 值遍历输出即可
      案例演示

         

    map 使用细节

      1)map 是引用类型,遵守引用类型传递的机制,在一个函数接收 map,修改后,会直接修改原来的 map 【案例演示】
      2)map 的容量达到后,再想 map 增加元素,会自动扩容,并不会发生 panic,也就是说 map 能

        

      3)map 的 value 也经常使用 struct 类型,更适合管理复杂的数据(比前面 value 是一个 map 更好),

      比如 value 为 Student 结构体 【案例演示,因为还没有学结构体,体验一下即可】

        

    map 的课堂练习题
      1)使 用 map[string]map[string]sting 的 map 类 型
      2)key: 表示用户名,是唯一的,不可以重复
      3)如果某个用户名存在,就将其密码修改"888888",如果不存在就增加这个用户信息,(包括昵称nickname 和 密码 pwd)。
      4)编写一个函数 modifyUser(users map[string]map[string]sting, name string) 完成上述功能

      代码实现

    package main 
    
    import "fmt"
    
    // 1)使用 map[string]map[string]sting  的 map 类型
    // 2)key: 表示用户名,是唯一的,不可以重复
    // 3)如果某个用户名存在,就将其密码修改"888888",如果不存在就增加这个用户信息,
    // (包括昵称 nickname 和 密码 pwd)。
    // 4)编写一个函数 modifyUser(users map[string]map[string]sting, name string) 完成上述功能
    
    func modifyUser(users map[string]map[string]string, name string) {
    
    	//判断 users 中是否有 name
    	//v , ok := users[name] 
    	if users[name] != nil {
    		//有这个用户
    		users[name]["pwd"] = "888888"
    	} else {
    		//没有这个用户
    		users[name] = make(map[string]string, 2) users[name]["pwd"] = "888888"
    		users[name]["nickname"] = "昵称~" + name //示意
    	}
    }
    
    func main() {
    	
    	users := make(map[string]map[string]string, 10) users["smith"] = make(map[string]string, 2) users["smith"]["pwd"] = "999999"
    	users["smith"]["nickname"] = "小花猫"
    
    	modifyUser(users, "tom") modifyUser(users, "mary") modifyUser(users, "smith")
    	fmt.Println(users)
    }
    

      

  • 相关阅读:
    hihoCoder #1062 : 最近公共祖先·一
    hihoCoder #1050 : 树中的最长路
    hihoCoder #1049 : 后序遍历
    108 Convert Sorted Array to Binary Search Tree 将有序数组转换为二叉搜索树
    107 Binary Tree Level Order Traversal II 二叉树的层次遍历 II
    106 Construct Binary Tree from Inorder and Postorder Traversal 从中序与后序遍历序列构造二叉树
    105 Construct Binary Tree from Preorder and Inorder Traversal 从前序与中序遍历序列构造二叉树
    104 Maximum Depth of Binary Tree 二叉树的最大深度
    102 Binary Tree Level Order Traversal 二叉树的层次遍历
    101 Symmetric Tree 判断一颗二叉树是否是镜像二叉树
  • 原文地址:https://www.cnblogs.com/Essaycode/p/12650194.html
Copyright © 2011-2022 走看看