go map

本文深入讲解了Go语言中Map的基本概念、定义方式及其使用方法。包括如何创建、初始化Map,如何进行基本的操作如读写、修改及删除元素,还探讨了Map的特性如长度和零值等。

go map

map 是在 Go 中将值(value)与键(key)关联的内置类型。通过相应的键可以获取到值(字典类型)2value值可以任意,但是go中value值必须都一致,key值只能用数字,字符串,布尔,key值也固定。

map的定义

var m map[string]int  //map[key值类型]value类型
fmt.Println(m)  // map[] 只定义,没有初始化,零值是nil
if m == nil {
    fmt.Println("map 零值是nil")
}
// 使用make创建map类型,第一个参数传类型,map有长度没有容量,因此只需要传一个参数
var m1 map[string]int=make(map[string]int)
fmt.Println(m1)  // map[]
if m1 == nil {  // m1 已初始化
    fmt.Println("map 零值是nil")
} else {
    fmt.Println("m1 已初始化")
}
虽然此时 m1和m打印出来的都是 map[],但是使用make创建map类型会以默认以 零 值初始化

map的使用

基本使用,除了限制多了点,和python字典类型差不多

m := map[string]int{"name":12,"age":19}
fmt.Println(m["age"])  // 取值
m["age"]=99      	// 修改值
// 赋值不存在的
m["sex"]=1  // 正常赋值
fmt.Println(m)  // map[age:99 name:12 sex:1]
// 取不存在的值,不会报错,会取出 value值的0值
fmt.Println(m["hobby"])  // 0

// 如果当这个值存在,并且就是 value值的0值,那么怎么判断呢
m["hobby"]=0
fmt.Println(m) // map[age:99 hobby:0 name:12 sex:1]
fmt.Println(m["hobby"])  // 0
// 可以根据key取vlaue,并判断value是否存在
 // 可以使用两个值来接收,第二个值是个布尔值,如果ok为true,说明存在,否则不存在
_,ok:=m["hobby"] 
fmt.Println(ok)  // true

go删除值,只能通过内置函数,并且只能根据key删除

m := map[string]int{"name":12,"age":19}
delete(m,"name")
delete(m,"hobby")  // 删除不存在的,不会报错
fmt.Println(m)

补充知识:

  1. map长度,len函数查看,就是key值的多少,并且map没有容量的说法,可以无限扩容
  2. map是引用类型,零值是 nil,引用类型一定要初始化,值类型不需要初始化就有零值
  3. map 之间不能使用 == 操作符判断,== 只能用来检查 map 是否为 nil
  4. 引用类型不能比较 ,值类型能比较
03-12
<think>好的,我需要帮助用户了解Go语言中Map的用法。首先,我应该回顾用户提供的引用内容,确保回答准确。根据引用[2],MapGo中的格式是map[K]T,K必须是可比较类型,而Map是引用类型。引用[4]提到Map的零值是nil,使用前必须用make初始化,否则会panic。引用[5]指出Map是无序的,迭代顺序不固定,因为是哈希表实现。引用[3]还提到不能直接用==比较Map,只能检查是否为nil。 接下来,我需要组织回答的结构。用户可能需要基础使用、初始化、增删改查、遍历、注意事项等方面。要分步骤讲解,每个部分给出代码示例,并引用相关文献。例如,初始化部分需要强调make的重要性,引用[4]。遍历时说明无序性,引用[5]。比较Map时提到不能用==,引用[3]。 还要注意用户提供的系统级指令,比如行内公式用$...$,但这里可能用不上。独立公式可能需要用$$,但Map教程可能不涉及数学公式。需要确保使用中文,生成相关问题,并在引用处添加标识。例如,在提到Map初始化时,末尾添加[^4]。 在生成相关问题部分,要考虑用户可能关心的并发安全、性能优化、与其它结构的对比等。引用[1]提到未来可能引入更多数据结构,可以建议相关问题。例如,Map的并发安全方法,优化技巧,与slice的区别等。 需要检查所有引用是否准确对应内容,比如引用[3]关于Map比较的部分,引用[5]关于迭代无序。避免错误引用,比如引用[1]更多是概述,可能用在结语部分。同时,确保代码示例正确,比如初始化、删除操作等。 最后,保持回答结构清晰,分点说明,每个部分有小标题,代码用代码块包裹,语言标记为go。确保回答真实可靠,符合Go语言官方文档的规范,并正确引用提供的资料。</think>### Go语言Map使用教程 #### 1. Map的基本概念 MapGo语言中的一种内置数据结构,用于存储键值对,格式为 `map[K]T`,其中 `K` 是键的类型(必须是可比较类型),`T` 是值的类型。Map是引用类型,零值为 `nil`,直接操作未初始化的Map会触发运行时错误。 --- #### 2. Map的初始化 - **使用`make`函数创建** 必须通过 `make` 函数初始化后才能操作: ```go m := make(map[string]int) // 初始化一个键为string、值为int的Map ``` - **字面量初始化** 可在声明时直接赋值: ```go m := map[string]int{ "apple": 5, "banana": 3, } ``` --- #### 3. Map的增删改查 - **添加或修改元素** ```go m["orange"] = 4 // 添加键"orange",值4 m["apple"] = 10 // 修改键"apple"的值为10 ``` - **删除元素** 使用 `delete` 函数: ```go delete(m, "banana") // 删除键"banana" ``` - **查询元素** 通过键访问值,并检查是否存在: ```go value, exists := m["apple"] if exists { fmt.Println(value) // 输出10 } ``` --- #### 4. Map的遍历 Map是无序的,遍历顺序不固定(由哈希表实现决定)[^5]: ```go for key, value := range m { fmt.Printf("Key: %s, Value: %d\n", key, value) } ``` --- #### 5. 注意事项 1. **不可用`==`比较Map** Map不能直接通过 `==` 运算符比较(只能检查是否为 `nil`)[^3]。 ```go if m1 == nil { /* 合法 */ } if m1 == m2 { /* 非法 */ } ``` 2. **并发安全问题** Map非线程安全,并发读写需通过锁或使用 `sync.Map`(适用于读多写少场景)[^4]。 3. **值为复合类型时的初始化** 若值为切片或嵌套Map,需逐层初始化: ```go nestedMap := make(map[string]map[int]string) nestedMap["a"] = make(map[int]string) // 内层Map需单独初始化 nestedMap["a"][1] = "test" ``` --- #### 6. 应用场景 - 快速查找、去重统计(如统计单词频率)。 - 缓存数据(如存储用户会话信息)。 - 配置管理(如键值对形式的参数配置)。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go&Python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值