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. ansible 基础命令

    ansible 命令总结 1. Ad-HOC: 适合临时执行任务2. Playbook: 适合一些复杂的部署和配置环境 一 . Ad-HOC: 适合临时执行任务ansible-doc -l 查看ans ...

  2. NodeJS2-5环境&调试----process(进程)

    argv(参数相关的) /* argv argv0 execArgv execPath */ const { argv, argv0, execArgv, execPath } = process; ...

  3. 使用where 过滤数据

    --本章主要内容是MySQL中使用where搜索条件进行过滤数据. where条件在from子句后面给出,如下所示: select name,price from shops where price& ...

  4. Python基础-day01-2

    第一个 Python 程序 目标 第一个 HelloPython 程序 Python 2.x 与 3​​.x 版本简介 执行 Python 程序的三种方式 解释器 -- python / python ...

  5. SpringBoot微服务电商项目开发实战 --- 全局异常处理

    上一篇文章讲了Redis缓存的安全防范及Kafka的接入及消息实现,今天接着前面的内容基础说说项目的优化和基础配置,今天要讲的内容主要是Spring Boot项目中的全局异常处理.为什么要做这件事呢? ...

  6. HttpRunner学习11--指定用例运行次数

    前言 在HttpRunner中,一般情况下,我们写的用例脚本都是每次运行一次,如果我们想要指定用例运行的次数,可以通过 times 关键字来实现. 测试场景 在这里,我们以访问 TesterHome ...

  7. 由于ie浏览器ajax缓存 导致layui table表格重载失败的解决办法

    where: { time:new Date()//增加一个数据接口的额外参数→时间戳 }

  8. Silky-CTF: 0x02 Vulhub Walkthrough

    靶机地址: https://www.vulnhub.com/entry/silky-ctf-0x02,307/ 主机扫描: HTTP进行目录爆破 尝试SQL注入会被封掉IP 经过尝试发现usernam ...

  9. 深入理解 Java 枚举

  10. NPM 问题汇总

    1. Error: setuid user id does not exist Error: setuid user id does not exist at /usr/local/lib/node_ ...