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\n",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\n",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"))
}

go语言之map的更多相关文章

  1. go语言学习--map的并发

    go提供了一种叫map的数据结构,可以翻译成映射,对应于其他语言的字典.哈希表.借助map,可以定义一个键和值,然后可以从map中获取.设置和删除这个值,尤其适合数据查找的场景.但是map的使用有一定 ...

  2. GO_05:GO语言基础map与函数

    1. map 1. 类似其它语言中的哈希表活着字典,以 key-value 形式存储数据 2. key 必须是支持 == 或 != 比较运算的类型,不可以是函数.map 或 slice 3. map ...

  3. GO语言基础map与函数

    1. map 1. 类似其它语言中的哈希表活着字典,以 key-value 形式存储数据 2. key 必须是支持 == 或 != 比较运算的类型,不可以是函数.map 或 slice 3. map ...

  4. 深度解密Go语言之 map

    目录 什么是 map 为什么要用 map map 的底层如何实现 map 内存模型 创建 map 哈希函数 key 定位过程 map 的两种 get 操作 如何进行扩容 map 的遍历 map 的赋值 ...

  5. 【Go语言】map在goroutine通信中的使用问题

    简介 本篇文章的主要内容是解决go语言map在使用中遇到的两个问题,对于初学者是不可避免的坑 一.cannot assign to struct field 当map中存在struct类型的成员,如果 ...

  6. Go语言的map

    map一般是以库的方式提供,在C++和C#和JAVA中都需要引用相应的库而Go语言不需要引入库,可以直接方便使用 定义:map是一堆键值对的未排序集合.无序 1.声明变量: map的声明基本上没有多余 ...

  7. Go语言的map如何判断key是否存在

    判断方式为value,ok := map[key], ok为true则存在 package main import "fmt" func main() { demo := map[ ...

  8. go语言学习--map中键值得删除

    测试 map1 中是否存在 key1: 在例子 8.1 中,我们已经见过可以使用 val1 = map1[key1] 的方法获取 key1 对应的值 val1.如果 map 中不存在 key1,val ...

  9. go语言学习--map类型的切片

    今天在项目中遇到了一个切片的map,记录下map切片的使用 package main import "fmt" func main() { // Version A: items ...

随机推荐

  1. Java内存大家都知道,但你知道要怎么管理Java内存吗?

    前言 深入研究Java内存管理,将增强你对堆如何工作.引用类型和垃圾回收的认识. 你可能会思考,如果你使用Java编程,关于内存如何工作你需要了解哪些哪些信息?Java可以进行自动内存管理,而且有一个 ...

  2. 3年Java开发6个点搞定高并发系统面试疑惑

    前言 其实所谓的高并发,如果你要理解这个问题呢,其实就得从高并发的根源出发,为啥会有高并发?为啥高并发就很牛逼? 说的浅显一点,很简单,就是因为刚开始系统都是连接数据库的,但是要知道数据库支撑到每秒并 ...

  3. Docker下载tomcat

    命令 下载tomcat docker pull tomcat //默认是latest版本具体可以到 hub.docker.com上查询 //如果想下其他版本以9.0.16示例那么: docker pu ...

  4. webpack前期了解

    webpack的核心概念(四个) 入口(entry) 输出(output) loader 插件(plugins) Entry(入口)——指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的 ...

  5. c++-纯虚函数和抽象类

    纯虚函数和抽象类 C面向接口编程和C多态 函数类型语法基础 函数指针做函数参数(回调函数)思想剖析 函数指针做函数参数两种用法(正向调用.反向调用) 纯虚函数 抽象类 抽象类基本概念 抽象类在多继承中 ...

  6. 基于Vue的前后端分离项目实践

    一.为什么需要前后端分离 1.1什么是前后端分离  前后端分离这个词刚在毕业(15年)那会就听说过,但是直到17年前都没有接触过前后端分离的项目.怎么理解前后端分离?直观的感觉就是前后端分开去做,即功 ...

  7. git版本控制入门--码云

    1.下载git:https://git-scm.com/download   2.安装过程一直点下一步即可.   3.进入刚创建的文件夹     4.在此时登录码云,创建项目.项目名称最好与文件夹名称 ...

  8. DUBBO: xml文件无法解析

    xml是: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http:/ ...

  9. 【THUPC 2018】赛艇

    Problem Description Lavender.Caryophyllus.Jasmine.Dianthus现在在玩一款名叫"赛艇"的游戏. 这个游戏的规则是这样的: 玩家 ...

  10. Dubbo学习系列之十一(Dashboard+Nacos规则推送)

    中国武术,门派林立,都是号称多少代的XXX传人,结果在面对现代武术时,经常被KO秒杀,为啥,光靠宣传和口号撑门面,终究是靠不住,必须得有真货 ,得经得住考验,所以不能只说Sentinel有多好,也得给 ...