Go 语言 - map的使用 -- 十安辰

一、map的基本介绍

map 是 key-value 数据结构,又称为字段或者关联数组。类似其它编程语言的集合, 在编程中是经常使用到。

二、map的声明

  1. 基本语法

var map 变量名 map[keytype]valuetype

  • key 可以是什么类型

golang 中的 map,的 key 可以是很多种类型,比如 bool, 数字,string, 指针, channel , 还可以是只包含前面几个类型的 接口, 结构体, 数组
通常 key 为 int 、string
注意: slice, map 还有 function 不可以,因为这几个没法用 == 来判断

  • valuetype 可以是什么类型

valuetype 的类型和 key 基本一样,这里就不再赘述了通常为: 数字(整数,浮点数),string,map,struct

  • 例子
//注意:声明是不会分配内存的,初始化需要 make ,分配内存后才能赋值和使用。
var a map[string]string 
var a map[string]int 
var a map[int]string
var a map[string]map[string]string
//1)map 在使用前一定要 make
//2)map 的 key 是不能重复,如果重复了,则以最后这个 key-value 为准
//3)map 的 value 是可以相同的.
//4)map 的 key-value 是无序
  • 官方文档对于make的说明

func make

func make(Type, size IntegerType) Type

内建函数make分配并初始化一个类型为切片、映射、或通道的对象。其第一个实参为类型,而非值。make的返回类型与其参数相同,而非指向它的指针。其具体结果取决于具体的类型:

切片:size指定了其长度。该切d片的容量等于其长度。切片支持第二个整数实参可用来指定不同的容量;
     它必须不小于其长度,因此 make([]int, 0, 10) 会分配一个长度为0,容量为10的切片。
映射:初始分配的创建取决于size,但产生的映射长度为0。size可以省略,这种情况下就会分配一个
     小的起始大小。
通道:通道的缓存根据指定的缓存容量初始化。若 size为零或被省略,该信道即为无缓存的。

三、map的使用

  1. 第一种使用方式
var a map[string]string
//在使用map前,需要先使用make给变量申请数据空间
a = make(map[string]string)
a["no1"] = "邓洪"
a["no2"] = "刘令"
a["no1"] = "李泰乐"
a["no2"] = "周佛心"
fmt.Println(a)

2.第二种使用方式

cities := make(map[string]string)
cities["no1"] = "贵阳"
cities["no2"] = "江西"
cities["no3"] = "北京"
fmt.Println(cities)
  1. 第三种使用方式
heroes := map[string]string{
    "no1" : "陆游"
    "no2" : "李白"
    "no3" : "杜甫"
}
heroes["no4"] = "王维"
fmt.Println(heroes)

四、mad的增删查改

  1. map的增加和更新

语法:`map[“key”] = value```
说明:如果key还没有,就是增加,如果key存在就是修改

  1. map删除

语法:delete(map, “key”)
说明:

  • delete()同make(),都是Go的内置函数
  • 如果key存在,就删除这个key-value,如果key不存在,就什么也不做,但是也不会报错

image.png

  1. map查找

如下:如果cities中存在no2,那么ok就为true,否则为false

value, ok := cities["no2"]
if ok {
    fmt.Printf("存在no2 值为%v\n", value)
} else {
    fmt.Printf("没有no2 值为%v\n", value)
}

五、map的遍历

map不同于数组,只能使用for-range遍历

cities := make(map[string]string)
cities["no1"] = "贵阳"
cities["no2"] = "江西"
cities["no3"] = "北京"
fmt.Println(cities)

for key, value := range cities{
    fmt.Printf("key = %v, cite = %v\n", key, value)
}

六、map的使用细节

  1. map 是引用类型,遵守引用类型传递的机制,在一个函数接收 map,修改后,会直接修改原来的 map
  2. map 的容量达到后,再想 map 增加元素,会自动扩容,并不会发生 panic,也就是说 map 能动态的增长 键值对(key-value)
  3. map 的 value ****也经常使用 struct 类型,更适合管理复杂的数据(比前面 value 是一个 map 更好),比如 value 为 Student 结构体
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值