zoukankan      html  css  js  c++  java
  • go语言之map

    go语言的map就相当于python的dict

    1、map的初始化

    	//创建map
    	//k的类型是int,v的类型是string
    	var test25_1 map[int]string
    
    	fmt.Println(test25_1)
    	//map[]
    
    	fmt.Println(test25_1 == nil)
    	//true
    
    
    
    	test25_2 := map[int]string{}
    
    	test25_3 := make(map[int]string)
    
    	fmt.Println(test25_2)
    	//map[]
    	fmt.Println(test25_3)
    	//map[]
    
    	//初始化一个有容量的map
    	test25_4 := make(map[int]string,10)
    
    	fmt.Println(test25_4)
    	//map[]
    
    	
    	//初始化map
    

      

    2、map的初始化

    	//定义的同时初始化
    	var test25_5 map[int] string = map[int]string{1:"test1",2:"test2"}
    
    	fmt.Println(test25_5)
    	//map[1:test1 2:test2]
    
    
    	//自动推倒类型
    
    	var test25_6 = map[int]string{3:"test3",4:"test4"}
    	fmt.Println(test25_6)
    	//map[3:test3 4:test4]
    

      

    3、map的键值操作,增和改

    	//键值操作
    
    	//修改
    	test25_6[3] = "test333"
    	fmt.Println(test25_6)
    	//map[3:test333 4:test4]
    
    	//增加
    	test25_6[5] = "test5"
    	fmt.Println(test25_6)
    	//map[3:test333 4:test4 5:test5]
    

      

    4、map的遍历操作

    	//map的遍历操作
    	for k,v := range test25_6{
    		fmt.Printf("k值为%d,v值为%s
    ",k,v)
    	}
    
    	//k值为5,v值为test5
    	//k值为3,v值为test333
    	//k值为4,v值为test
    
    
    	for k:= range test25_6{
    		fmt.Printf("k值为%d,v值为%s
    ",k,test25_6[k])
    	}
    
    	//k值为3,v值为test333
    	//k值为4,v值为test4
    	//k值为5,v值为test5
    

      

    5、判断map是否存在某个k

    	//判断某个k对应的v是否存在
    
    	//value为k对应的值,ok为是否存在
    	value,ok := test25_6[3]
    
    	fmt.Println(value,ok)
    	//test333 true
    	value1,ok1 := test25_6[7]
    
    	fmt.Println(value1,ok1)
    	//false
    

      

    6、删除map中的某个k

    	fmt.Println(test25_6)
    	//map[3:test333 4:test4 5:test5]
    	delete(test25_6,3)
    	fmt.Println(test25_6)
    	//map[4:test4 5:test5]
    

      

    Go 语言Map(集合)

    Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。

    Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。

    定义 Map

    可以使用内建函数 make 也可以使用 map 关键字来定义 Map:

    /* 声明变量,默认 map 是 nil */
    var map_variable map[key_data_type]value_data_type
    
    /* 使用 make 函数 */
    map_variable := make(map[key_data_type]value_data_type)
    

    如果不初始化 map,那么就会创建一个 nil map。nil map 不能用来存放键值对

    实例

    下面实例演示了创建和使用map:

    package main
    
    import "fmt"
    
    func main() {
        var countryCapitalMap map[string]string /*创建集合 */
        countryCapitalMap = make(map[string]string)
    
        /* map插入key - value对,各个国家对应的首都 */
        countryCapitalMap [ "France" ] = "巴黎"
        countryCapitalMap [ "Italy" ] = "罗马"
        countryCapitalMap [ "Japan" ] = "东京"
        countryCapitalMap [ "India " ] = "新德里"
    
        /*使用键输出地图值 */
        for country := range countryCapitalMap {
            fmt.Println(country, "首都是", countryCapitalMap [country])
        }
    
        /*查看元素在集合中是否存在 */
        capital, ok := countryCapitalMap [ "American" ] /*如果确定是真实的,则存在,否则不存在 */
        /*fmt.Println(capital) */
        /*fmt.Println(ok) */
        if (ok) {
            fmt.Println("American 的首都是", capital)
        } else {
            fmt.Println("American 的首都不存在")
        }
    }
    

    以上实例运行结果为:

    France 首都是 巴黎
    Italy 首都是 罗马
    Japan 首都是 东京
    India  首都是 新德里
    American 的首都不存在
    

    delete() 函数

    delete() 函数用于删除集合的元素, 参数为 map 和其对应的 key。实例如下:

    package main
    
    import "fmt"
    
    func main() {
            /* 创建map */
            countryCapitalMap := map[string]string{"France": "Paris", "Italy": "Rome", "Japan": "Tokyo", "India": "New delhi"}
    
            fmt.Println("原始地图")
    
            /* 打印地图 */
            for country := range countryCapitalMap {
                    fmt.Println(country, "首都是", countryCapitalMap [ country ])
            }
    
            /*删除元素*/ delete(countryCapitalMap, "France")
            fmt.Println("法国条目被删除")
    
            fmt.Println("删除元素后地图")
    
            /*打印地图*/
            for country := range countryCapitalMap {
                    fmt.Println(country, "首都是", countryCapitalMap [ country ])
            }
    }
    

    以上实例运行结果为:

    原始地图
    India 首都是 New delhi
    France 首都是 Paris
    Italy 首都是 Rome
    Japan 首都是 Tokyo
    法国条目被删除
    删除元素后地图
    Italy 首都是 Rome
    Japan 首都是 Tokyo
    India 首都是 New delhi
    

    基于 go 实现简单 HashMap,暂未做 key 值的校验。

    package main
    
    import (
        "fmt"
    )
    
    type HashMap struct {
        key string
        value string
        hashCode int
        next *HashMap
    }
    
    var table [16](*HashMap)
    
    func initTable() {
        for i := range table{
            table[i] = &HashMap{"","",i,nil}
        }
    }
    
    func getInstance() [16](*HashMap){
        if(table[0] == nil){
            initTable()
        }
        return table
    }
    
    func genHashCode(k string) int{
        if len(k) == 0{
            return 0
        }
        var hashCode int = 0
        var lastIndex int = len(k) - 1
        for i := range k {
            if i == lastIndex {
                hashCode += int(k[i])
                break
            }
            hashCode += (hashCode + int(k[i]))*31
        }
        return hashCode
    }
    
    func indexTable(hashCode int) int{
        return hashCode%16
    }
    
    func indexNode(hashCode int) int {
        return hashCode>>4
    }
    
    func put(k string, v string) string {
        var hashCode = genHashCode(k)
        var thisNode = HashMap{k,v,hashCode,nil}
    
        var tableIndex = indexTable(hashCode)
        var nodeIndex = indexNode(hashCode)
    
        var headPtr [16](*HashMap) = getInstance()
        var headNode = headPtr[tableIndex]
    
        if (*headNode).key == "" {
            *headNode = thisNode
            return ""
        }
    
        var lastNode *HashMap = headNode
        var nextNode *HashMap = (*headNode).next
    
        for nextNode != nil && (indexNode((*nextNode).hashCode) < nodeIndex){
            lastNode = nextNode
            nextNode = (*nextNode).next
        }
        if (*lastNode).hashCode == thisNode.hashCode {
            var oldValue string = lastNode.value
            lastNode.value = thisNode.value
            return oldValue
        }
        if lastNode.hashCode < thisNode.hashCode {
            lastNode.next = &thisNode
        }
        if nextNode != nil {
            thisNode.next = nextNode
        }
        return ""
    }
    
    func get(k string) string {
        var hashCode = genHashCode(k)
        var tableIndex = indexTable(hashCode)
    
        var headPtr [16](*HashMap) = getInstance()
        var node *HashMap = headPtr[tableIndex]
    
        if (*node).key == k{
            return (*node).value
        }
    
        for (*node).next != nil {
            if k == (*node).key {
                return (*node).value
            }
            node = (*node).next
        }
        return ""
    }
    
    //examples 
    func main() {
        getInstance()
        put("a","a_put")
        put("b","b_put")
        fmt.Println(get("a"))
        fmt.Println(get("b"))
        put("p","p_put")
        fmt.Println(get("p"))
    }
    
  • 相关阅读:
    nginx 按天生成日志
    cmder
    EXCEL最大行数问题:org.apache.xmlbeans.impl.store.Saver$TextSaver.resize(Saver.java:1700)
    nginx configure 错误记录
    Flume NetCat Demo
    Flume
    hbase
    kafka安装配置
    azkaban
    sqoop
  • 原文地址:https://www.cnblogs.com/bainianminguo/p/10865353.html
Copyright © 2011-2022 走看看