Go map使用

 

前言

map 是在 Go 中将值(value)与键(key)关联的内置类型。通过相应的键可以获取到值。

在一个map里所有的键都是唯一的,而且必须是支持==和!=操作符的类型,切片、函数以及包含切片的结构类型由于具有引用语义,不能作为映射的键,使用这些类型会造成编译错误。
map的value值可以是任意类型,没有限制。map里所有键的数据类型必须是相同的,值也必须如此,但键和值的数据类型可以不相同。
注意:map是无序的,我们无法决定它的返回顺序,所以,每次打印结果的顺序有可能不同。

创建与初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main
 
import "fmt"
 
func main() {
 
    //初始化
    //1.定义同时初始化
    var m1 map[int]string  =map[int]string{1:"linlin",2:"sanye"}
    fmt.Println(m1)
 
    //2.自动推导类型
    m2 := map[int]string{1:"linlin",2:"sanye"}
    fmt.Println(m2)
 
    //3.使用make创建
    m3 :=make(map[int]string)
    fmt.Println(m3)
    //创建固定长度的map
    m4 := make(map[int]string,10)
    fmt.Println(m4)
}

  

访问与赋值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main
 
import "fmt"
 
func main() {
 
    //初始化
    m2 := map[int]string{1:"linlin",2:"sanye"}
    fmt.Println(m2) //map[1:linlin 2:sanye]
    m2[1] = "sanye"
    m2[2] = "linlin"
    fmt.Println(m2) //map[1:sanye 2:linlin]
    fmt.Println(m2[1],m2[2])//sanye linlin
}

  

遍历

Map的迭代顺序是不确定的,并且不同的哈希函数实现可能导致不同的遍历顺序。在实践中,遍历的顺序是随机的。每一次遍历都不相同。
这是故意的,每次都使用随机的遍历顺序可以强制要求程序不会依赖具体的哈希函数实现。

当使用 for range 遍历 map 时,不保证每次执行程序获取的元素顺序相同!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main
 
import "fmt"
 
func main() {
 
    m3 := map[int]string{0:"linlin",1:"sanye",2:"timi",3:"meyi"}
 
    for k,v := range m3{
        fmt.Println("key:%d value:%s",k,v)
    }
 
    //判断map中key是否存在
    if v,has :=m3[1];has{ //map[下标]
        fmt.Println("value=",v,"has=",has)
    } else{
        fmt.Println("value=",v,"has=",has)
    }
 
}

  

删除

使用delete()函数,指定key值可以方便的删除map中的k-v映射。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main
 
import "fmt"
 
func mapDelete(m map[int]string,key int) map[int]string{
    delete(m,key)
    return m
}
 
func main() {
 
    m3 := map[int]string{0:"linlin",1:"sanye",2:"timi",3:"meyi"}
    fmt.Println(m3)//map[0:linlin 1:sanye 2:timi 3:meyi]
    delete(m3,1) //删除key值为2的map
    fmt.Println(m3)//map[0:linlin 2:timi 3:meyi]
    mapDelete(m3,0)
    fmt.Println(m3)//map[2:timi 3:meyi]
 
}

  

map为引用类型

map 也是引用类型。当 map 被赋值为一个新变量的时候,它们指向同一个内部数据结构。因此,改变其中一个变量,就会影响到另一变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main
import (
    "fmt")
func main() {
    personSalary := map[string]int{
        "steve": 12000,
        "jamie": 15000,
    }
    personSalary["mike"] = 9000
    fmt.Println("Original person salary", personSalary)
    newPersonSalary := personSalary
    newPersonSalary["mike"] = 18000
    fmt.Println("Person salary changed", personSalary)
}

上面程序中的第 14 行,personSalary 被赋值给 newPersonSalary。下一行 ,newPersonSalary 中 mike 的薪资变成了 18000 。personSalary 中 Mike 的薪资也会变成 18000。程序输出:

Original person salary map[steve:12000 jamie:15000 mike:9000]
Person salary changed map[steve:12000 jamie:15000 mike:18000]

当 map 作为函数参数传递时也会发生同样的情况。函数中对 map 的任何修改,对于外部的调用都是可见的。

 

map的相等性与长度

map相等性

map 之间不能使用 == 操作符判断,== 只能用来检查 map 是否为 nil

判断两个 map 是否相等的方法是遍历比较两个 map 中的每个元素。

map长度

1
2
3
4
5
6
7
8
9
10
11
package main
import (
    "fmt")
func main() {
    personSalary := map[string]int{
        "steve": 12000,
        "jamie": 15000,
    }
    personSalary["mike"] = 9000
    fmt.Println("length is", len(personSalary)) //结果为3
}
posted @   -零  阅读(894)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示