zoukankan      html  css  js  c++  java
  • 8 map的用法

    what's map

    go里面的map和python字典差不多。

    • 类似其他语言中的哈希表或者字典,以key-value的形式存储的数据
    • key必须是支持==或者!=比较运算的类型,不可以是函数、map或者slice
    • map查找比线性搜索快很多,但比使用索引访问数据的类型慢100倍
    • map使用make()创建,支持:= 这种简写方式
    • make([keyType]valueType,cap),cap表示容量,可以省略
    • 超出容量时会自动扩容,但尽量提供一个合理的初始值
    • 使用len()获取元素个数
    • 键值对不存在的时候自动添加,使用delete() 删除某键值对
    • 使用for range 对 map 和slice 进行迭代操作
    如何简单的创建map

    请看代码例子:

    func main() {
    	var m map[int]string
    	m = map[int]string{}
    	var m map[int]string = make(map[int]string)   // 或者也可以这样写
    	n := make(map[int]string)   // 或者这样写
    	fmt.Println(m)
    }
    
    map的简单用法

    主要介绍如何给map添加值,怎么从map里面取值,怎么删除指定key的值在map里面

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	m := make(map[int]string)  // 创建map
    	m[1] = "ok"   // 给map赋值
    	m[2] = "go"   
    	a := m[2] // 取出key为1的值
    	delete(m, 1)   // 删除指定key的值
    	fmt.Println(m, a)
    }
    
    map高级用法之一-两层map嵌套
    1. 在map里面在嵌套一层map
    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	m := make(map[int]map[int]string)   // 申明一个m
    	m[1] = make(map[int]string)      // 声明m[1]是一个map
    	m[1][1] = "OK"   // 往m[1]里面开始插入值
    	fmt.Println(m)  
    }
    
    1. 多层嵌套的返回值
    func main() {
    	m := make(map[int]map[int]string)
    	m[1] = make(map[int]string)
    	m[2] = make(map[int]string)
    	m[1][1] = "OK"
    	a, i := m[2][1]  // 此时我们从未定义这个值的话,取这个值第一个a是空值,第二个i是false表示未定义,如果是true表示定义了
    	fmt.Println(m)
    	fmt.Println(a, i)
    }
    
    map高级用法之二-数组元素全是map与for循环遍历该数组

    我们创建一个数组,数组的元素都是map,此时如果我们想遍历这个数组的元素,每个元素都赋值下,该怎么做?

    1. 错误做法:
    func main() {
    	sm := make([]map[int]string, 5)
    	for _, v := range sm {
    		v = make(map[int]string, 1)
    		v[1] = "OK"  // v只是这个map的一个拷贝,所以这个v即使做了赋值,也影响不到sm
    		fmt.Println(v)
    	}
    	fmt.Println(sm)
    }
    
    1. 正确的做法:
    func main() {
    	sm := make([]map[int]string, 5)
    	for i := range sm {
    		sm[i] = make(map[int]string, 1)  // 直接把map给赋值,从而影响到sm
    		sm[i][1] = "OK"   
    	}
    	fmt.Println(sm)
    }
    
    

    练习1: 如何对map 的可以进行排序

    map的key是无序的,那么如何进行排序呢?请看下面的代码

    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))
    	i := 0
    	for k, _ := range m {
    		s[i] = k
    		i++
    	}
    	sort.Ints(s)
    	fmt.Println(s)
    }
    

    练习2: 如何把一个map的K/V 对换位置

    举个例子:
    m:{1: "a", 2: "b", 3: "c", 4: "d", 5: "e"}
    我对调下K/V的位置,结果如下:
    m2: {c:3 d:4 e:5 a:1 b:2}
    了解以后请看代码:

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	m := map[int]string{1: "a", 2: "b", 3: "c", 4: "d", 5: "e"}
    	m2 := map[string]int{}
    	for k, v := range m {
    		m2[v] = k
    	}
    	fmt.Println("m", m)
    	fmt.Println("m2", m2)
    }
    
  • 相关阅读:
    平台
    重构之践
    Linux.NET
    系统分析员级下午试题II(论文)解答方法
    通用泛型存储接口的设计
    .NET平台4.0 发布网站流程及出错总结
    在IIS上发布基于Windows Azure Service Bus的WCF服务
    epoll + 多线程实现并发网络连接处理
    Linux进程地址空间之初探:一
    排序、搜索
  • 原文地址:https://www.cnblogs.com/liaojiafa/p/6828244.html
Copyright © 2011-2022 走看看