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修饰符public,protected,default,private访问权限

    public 具有最大的访问权限.所有类可访问. protected 主要是用来保护子类.自身.子类及同一个包中类可以访问 default 没有加修饰符的.有时候也称为friendly,它是针对本包访 ...

  2. 4个点说清楚Java中synchronized和volatile的区别

    作者 : Hollis 回顾一下两个关键字:synchronized和volatile 1.Java语言为了解决并发编程中存在的原子性.可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如sy ...

  3. fineuploader php服务端

    新版本的fineuploader项目中已经没有现成的php server端,需要额外使用composer进行安装,折腾好久才下下来,在此分享出来给大家. 下载地址: http://files.cnbl ...

  4. Python基础知识第八篇(集合)

    #集合是无序的#集合是不同元素组成的#集合是不可变的,列如:列表,字典,元组#创建空集合 s=set() # s={1,2,3,4,2} # print(s) #集合添加>>>> ...

  5. sleep方法要求处理中断异常:InterruptedException

    package seday08.thread;/*** @author xingsir * 当一个线程调用sleep方法处于阻塞状态的过程中,这个线程的中断方法interrupt被调用时,则sleep ...

  6. Ajax获取网页添加到div中

    1:利用DOM获取该 div 的 ID,然后清空该DIV的内容(如果你需要接着里面的内容添加可不要清空):需要注意点是清空最好用“ empty()  ”: 2: 把  async设成true ,否则又 ...

  7. WPF布局容器

    1.StackPanel:堆栈面板,通过Orientation属性设置子元素的布局排列方向为“Vertical”(垂直)和“Horizontal”(水平),不写其默认值为“Vertical”,当设置为 ...

  8. 内网渗透教程大纲v1.0

    内网渗透 ☉MS14-068(CVE-2014-6324)域控提权利用及原理解析 ☉域控权限提升PTH攻击 未完待续...

  9. LINUX OS EXERCISE 08

    1 配置crontab计划任务时,记录的格式是什么? 分钟 小时 日期 月份 星期 可执行语句 2 配置crontab计划任务实例. 以root用户身份添加计划任务,每天早上7:30启动sshd服务, ...

  10. Prometheus学习系列(八)之Prometheus API说明

    前言 本文来自Prometheus官网手册 和 Prometheus简介 HTTP API 在Prometheus服务器上的/api/v1下可以访问当前稳定的HTTP API. 将在该端点下添加任何非 ...