代码编织梦想

map 是一种特殊的数据结构:一种元素对 (pair) 的无序集合,pair 的一个元素是 key,对应的另一个元素是 value,所以这个结构也称为关联数组或字典。这是一种快速寻找值的理想结构:给定 key,对应的 value 可以迅速定位。

声明和初始化方法

声明方法

在声明的时候不需要知道 map 的长度,map 是可以动态增长的。未初始化的 map 的值是 nil。

var map1 map[keytype]valuetype
var map1 map[string]int

key 可以是任意可以用 == 或者 != 操作符比较的类型,比如 string、int、float32(64)。所以数组、切片和结构体不能作为 key (译者注:含有数组切片的结构体不能作为 key,只包含内建类型的 struct 是可以作为 key 的),但是指针和接口类型可以。如果要用结构体作为 key 可以提供 Key() 和 Hash() 方法,这样可以通过结构体的域计算出唯一的数字或者字符串的 key。

初始化方法

var map1 = make(map[keytype]valuetype)
map1 := make(map[keytype]valuetype)
map1 :=map[int]string{1:"asd",2:"adas",3:"dad"}

可以使用make的第三个参数capacity定义容量

map2 := make(map[string]float32, 100)

测试键值对是否存在及删除元素

测试存在

使用下面的方法可以判断,对应的键值对是否存在

val1, isPresent = map1[key1]

isPresent 返回一个 bool 值:如果 key1 存在于 map1,val1 就是 key1 对应的 value 值,并且 isPresent 为 true;如果 key1 不存在,val1 就是一个空值,并且 isPresent 会返回 false。

删除元素

直接 delete(map1, key1) 就可以。
如果 key1 不存在,该操作不会产生错误。

map的for range操作

for key, value := range map1 {
	...
}

注意 map 不是按照 key 的顺序排列的,也不是按照 value 的序排列的。

译者注:map 的本质是散列表,而 map 的增长扩容会导致重新进行散列,这就可能使 map 的遍历结果在扩容前后变得不可靠,Go 设计者为了让大家不依赖遍历的顺序,每次遍历的起点–即起始 bucket 的位置不一样,即不让遍历都从某个固定的 bucket0 开始,所以即使未扩容时我们遍历出来的 map 也总是无序的。

练习 8.1 map_days.go

创建一个 map 来保存每周 7 天的名字,将它们打印出来并且测试是否存在 “Tuesday” 和 “Hollyday”。

package main

import "fmt"

func main() {
	week := map[string]int{"Monday": 1, "Tuesday": 2, "Wednesday": 3, "Thursday": 4, "Friday": 5, "Saturday": 6, "Sunday": 7}
	fmt.Print(week, "\n")
	for key, value := range week {
		if key == "Tuesday" {
			fmt.Print(value, "Tuesday存在\n")
		} else if key == "Hollyday" {
			fmt.Print(value, "Hollyday存在\n")
		} else {
			fmt.Print("不存在\n")
		}
	}
}

结果:
在这里插入图片描述

map的切片

假设我们想获取一个 map 类型的切片,我们必须使用两次 make() 函数,第一次分配切片,第二次分配切片中每个 map 元素

items := make([]map[int]int, 5)
for i:= range items {
	items[i] = make(map[int]int, 1)
	items[i][1] = 2
}

map 的排序

如果你想为 map 排序,需要将 key(或者 value)拷贝到一个切片,再对切片排序

package main

import (
	"fmt"
	"sort"
)

var (
	barVal = map[string]int{"alpha": 34, "bravo": 56, "charlie": 23,
		"delta": 87, "echo": 56, "foxtrot": 12,
		"golf": 34, "hotel": 16, "indio": 87,
		"juliet": 65, "kili": 43, "lima": 98}
)

func main() {
	fmt.Println("unsorted:")
	for k, v := range barVal {
		fmt.Printf("Key: %v, Value: %v / ", k, v)
	}
	keys := make([]string, len(barVal))
	i := 0
	for k, _ := range barVal {
		keys[i] = k
		i++
	}
	sort.Strings(keys)
	fmt.Println()
	fmt.Println("sorted:")
	for _, k := range keys {
		fmt.Printf("Key: %v, Value: %v / ", k, barVal[k])
	}
}

map键值对调

如果 map 的值类型可以作为 key 且所有的 value 是唯一的,那么通过下面的方法可以简单的做到键值对调

package main
import (
	"fmt"
)

var (
	barVal = map[string]int{"alpha": 34, "bravo": 56, "charlie": 23,
							"delta": 87, "echo": 56, "foxtrot": 12,
							"golf": 34, "hotel": 16, "indio": 87,
							"juliet": 65, "kili": 43, "lima": 98}
)

func main() {
	invMap := make(map[int]string, len(barVal))
	for k, v := range barVal {
		invMap[v] = k
	}
	fmt.Println("inverted:")
	for k, v := range invMap {
		fmt.Printf("Key: %v, Value: %v / ", k, v)
	}
}

练习 8.2 map_drinks.go

构造一个将英文饮料名映射为法语(或者任意你的母语)的集合;先打印所有的饮料,然后打印原名和翻译后的名字。接下来按照英文名排序后再打印出来。

package main

import (
	"fmt"
	"sort"
)

func main() {
	drink := map[string]string{"可乐": "cola", "雪碧": "xuebi", "红牛": "redmer", "脉动": "maidong", "冰红茶": "blacktea"}
	for _, value := range drink {
		fmt.Print(value, "\n")
	}
	for key, value := range drink {
		fmt.Print(key, ":", value, "\n")
	}
	sl := make([]string, len(drink))
	i := 0
	for _, value := range drink {
		sl[i] = value
		i++
	}
	sort.Strings(sl)
	for _, value := range sl {
		fmt.Print(value, "\n")
	}
}

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41032328/article/details/127109422

go map学习笔记-爱代码爱编程

go map note 1.声明和赋值 var myGreeting map[string]string //声明map,可以直接make() myGreeting = make(map[string]

golang学习笔记之map元素删除_woailuo626的博客-爱代码爱编程_golang map 删除

golang学习笔记之map元素删除 golang map元素删除要比c++方便多了,可以直接在循环遍历的时候删除元素,而不用担心程序崩溃; 示例代码如下: package main import ( "fmt"

五、Golang学习笔记:Map字典-爱代码爱编程

Golang中map的学习笔记 文章目录 Golang中map的学习笔记map概念map创建与初始化map键与值map作为函数参数map案例 map概念 数组和切片的问题:通过下标获取数据,不方便 map概念(字典):无序的键值对集合,通过key快速索引数据指向value map创建与初始化 func main(){ //va

go二维map_go语言学习笔记(18)-二维数组和map-爱代码爱编程

二维数组 二维数组在声明/定义时有对应四种写法(类似一维数组) var 数组名 [大小][大小]类型 = [大小][大小]类型{{初值...},{初值...}} var 数组名 [大小][大小]类型 = [...][大小]类型{{初值...},{初值...}} var 数组名 = [大小][大小]类型{{初值...},{初值...}} var

golang-阅读雨痕大神的Go语言学习笔记的心得-爱代码爱编程

golang-阅读雨痕大神的Go语言学习笔记的心得 第一章 概述1.1 go与java中的局部变量初始化问题1.2 golang中实现生产者消费者模型,利用管道进行数据通信第二章 类型2.1 类型推断的使用注意2.2 常量与变量的区别2.3 常量的值类型省略2.4 go的枚举2.5 常量和变量到底有什么区别2.6 go 基本类型2.7 go 引用类

go语言学习笔记-爱代码爱编程

文章目录 Go01_准备工作1.1 下载包1.2 环境变量1.3 IDE选择02_HelloWord03_变量常量声明3.1 变量类型3.2 局部变量3.3 全局变量3.4 声明多个变量3.5 常量3.5 示例04_函数4.1 写法4.2 调用+放回值4.3 函数执行过程 Go 01_准备工作 1.1 下载包 谷歌下载https://g

Go语言学习笔记:3 map-爱代码爱编程

一.语法基础         Go语言中 map的定义语法如下: map[KeyType]ValueType         1.KeyType:表示键的类型         2.ValueType:表示键对应的值的类型。 map类型的变量默认初始值为nil,需要使用make()函数来分配内存: make(map[KeyType]ValueT

golang学习笔记第二部分:11.map_吉甫作诵的博客-爱代码爱编程

golang学习笔记第二部分:11.map 22、map map的定义 map是key-value数据结构,又称为字段或关联数组,类似其他编程语言的集合。基本语法:var map变量名 map[key type]value typekey可以是很多类型,slice、map、function不可以作为key type,因为没法用==判断;通常是int、

golang学习笔记—map_sentiment.的博客-爱代码爱编程

map map是一种key:value键值对的数据结构容器,map内部实现是哈希表(hash) map最重要的一点是通过key来快速检索数据,key类似于索引,指向数据的值 map是引用类型 声明 可以使用内键函数make也可以使用map关键字来声明 //声明变量,默认map值是nil var map_variable map[key]valu

go语言学习笔记—golang标准库json包_pppsych的博客-爱代码爱编程

文章目录 一 核心函数1.1 Marshal1.2 Unmarshal二 核心结构2.1 Decoder2.2 Encoder json包可以实现json的编码和解码,就是将json字符串转换为struct,或者将struct转换为json。 一 核心函数 1.1 Marshal func Marshal(v interface{}) (

golang学习笔记——map_阿伟学编程~的博客-爱代码爱编程

Map Map是一种无序的键值对(key: value)集合,其内部使用的使用hash表来实现的 Map是无序的,我们无法决定它的返回顺序 Map是引用类型,必须初始化才能使用 定义 //语法:map[keyType][ValueType] // map 类型的变量默认初始值为nil,需要使用make()函数来分配内存 make(map[Ke

go语言学习笔记-爱代码爱编程

  总结一下初学go语言的笔记,方便复习   参考书籍:《go语言趣学指南》 1.初识go语言   使用playground运行代码   使用main方法标识代码入口   大括号的唯一位置     

【笔记】go语言学习笔记-爱代码爱编程

一、概述­   ­●什么是程序:    程序:为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合 ­●Go语言 是区块链最主流的编程语言 同时也是当前最具发展潜力的语言 ­●Go语言是Google公司创造的语言,也是Google主推的语言。 ­●Google创造Golang的原因 ●Golang的语言

【golang学习笔记2.2】 map、结构体和接口_go map接口-爱代码爱编程

Map的基本介绍 map是一个key-value的数据结构;类似于其他编程语言中的集合 基本语法和注意事项 var map 变量名 map[keytype]valuetypekeytype的类型有很多种比如bool,st

go七天开发挑战:7天实现web框架-爱代码爱编程

 学习资料来自:GitHub - geektutu/7days-golang: 7 days golang programs from scratch (web framework Gee, distributed cache GeeCache, object relational mapping ORM framework GeeORM, rpc fra