zoukankan      html  css  js  c++  java
  • Golang 基础 05 -- 映射 map

    目录

    @

    简介

    • 类似其他语言的哈希表或者字典,以key-value的形式存储数据
    • key必须支持==或者!=比较运算的类型,不能是函数,map或者slice(他们都不支持),但是value可以呀,嘿嘿
    • map查找比线性搜索快很多,但比使用索引访问数据的类型慢100倍(array,slice)

    声明定义初始化

    • map支持使用make()创建,也可以用传统方式创建支持:=这种简写形式
    • make([keyType]valueType, cap),cap是容量,可省略
    • 超过容量会自动扩容,但是尽量使用合适的初始值
    • 使用len() 获取元素个数
    • 键值对不存在就自动添加,使用delete(map,key)删除某个键值对
    func main(){
    	var m map[int]string = map[int]string{}
    	var mm map[int]string = make(map[int]string)
    	mmm := make(map[int]string)
    	m[1] = "ok"
    	a := m[1]
    	fmt.Println(m,a,mm,mmm)
    	delete(m,1)
    	fmt.Println(m,a)
    }
    /*
    > Output:
    command-line-arguments
    map[1:ok] ok map[] map[]
    map[] ok
    */
    

    复杂map

    func main(){
    	var m map[int]map[int]string
    	m = make(map[int]map[int]string)
    	//这里记得里面的value对应的map也要初始化
    	a, ok := m[2][1]
    	if !ok {
    		m[2] = make(map[int]string)
    	}
    	m[2][1]="GOOD"
    	a,ok = m[2][1]
    	fmt.Println(a, ok)
    }
    /*
    > Output:
    command-line-arguments
    GOOD true
    */
    

    map和slice的迭代操作

    /*
    	for i,v:=range slice/map{
    
    	}*/
    	//如果是slice : i是索引,int型,v是其对应的值的拷贝,对v的任何操作都不会影响slice
    	//如果是map : i,v对应键值对,对v的任何操作都不会影响map
    
    func main(){
    	sm := make([]map[int]string, 5)
    	for _, v := range sm {
    		v = make(map[int]string, 1)
    		v[1]="ok"
    		fmt.Println(v)
    	}
    	fmt.Println(sm)
    	for i := range sm {
    		sm[i] = make(map[int]string, 1)
    		sm[i][1] = "not ok"
    		fmt.Println(sm[i])
    	}
    	fmt.Println(sm)
    }
    /*
    > Output:
    command-line-arguments
    map[1:ok]
    map[1:ok]
    map[1:ok]
    map[1:ok]
    map[1:ok]
    [map[] map[] map[] map[] map[]]
    map[1:not ok]
    map[1:not ok]
    map[1:not ok]
    map[1:not ok]
    map[1:not ok]
    [map[1:not ok] map[1:not ok] map[1:not ok] map[1:not ok] map[1:not ok]]
    */
    

    利用slice对map进行间接排序

    • map是无序的
    • 引入包sort,使用sort.Ints()函数
    func main(){
    	m := map[int]string{1:"a",2:"b",3:"c",4:"d",5:"f",6:"g"}
    	s := make([]int, len(m))
    	i := 0
    	for k,_ := range m {
    		s[i] = k
    		i++
    	}
    	sort.Ints(s)
    	for _,v := range s {
    		fmt.Println(m[v])
    	}
    	fmt.Println(s)
    }
    /*
    > Output:
    command-line-arguments
    a
    b
    c
    d
    f
    g
    [1 2 3 4 5 6]
    */
    

    例子:交换key和value

    func main(){
    	m := map[int]string{1:"a",2:"b",3:"c",4:"d",5:"f",6:"g"}
    	mm := make(map[string]int,len(m))
    	for k,v := range m {
    		mm[v]=k
    	}
    	fmt.Println(m)
    	fmt.Println(mm)
    }
    /*
    > Output:
    command-line-arguments
    map[5:f 6:g 1:a 2:b 3:c 4:d]
    map[f:5 g:6 a:1 b:2 c:3 d:4]
    */
    
  • 相关阅读:
    嵌入式Linux设备驱动编程(1):基础
    嵌入式Linux网络编程
    Linux进程间通信(5):消息队列
    Android网络通信(2):HTTP通信
    Android网络通信(3):Socket通信
    Android网络通信(5):WiFi
    Linux任务、进程和线程
    Android程序的安装和卸载
    Android网络通信(4):WebKit
    Android网络通信(1):Android网络基础
  • 原文地址:https://www.cnblogs.com/leafs99/p/golang_basic_05.html
Copyright © 2011-2022 走看看