当前位置: 首页 > java >正文

golang的map

map

map的介绍

map是key-value数据结构,又称为字段或者关联数组,类似其它语言的集合

map的声明

var 变量名 map[keytype]valuetype

keytype可以是什么类型:
int,float,bool,string,channel,指针,也可以是由这几种类型组成的结构体,数组,接口
通常为int,string
但绝对不能是:slice,map,function
valuetype可以是什么类型:
基本和keytype一致
通常为int,float,string,mao,struct

map声明的例子:

var a map[string]string
var a map[string]int
var a map[int]string
var a map[string]map[string]string

注意:声明并不会分配内存,需要make函数进行初始化分配内存,分配内存后才能赋值和使用
不像数组,声明完就分配好了内存

map的快速入门

func main() {
a := make(map[string]string, 10)
a[“lsh”] = “clw”
a[“clw”] = “zjw”
a[“zjw”] = “lxc”
fmt.Println(a)
}
输出结果:
map[clw:zjw lsh:clw zjw:lxc]

可以看出,map是会自动按照key的大小从小到大来进行排序的
map的key是不能重复的,但是value是可以重复的

map的使用方式

  1. make
    a := make(map[string]string)
    a[“lsh”] = “clw”
    a[“clw”] = “zjw”
    a[“zjw”] = “lxc”
    fmt.Println(a)
  2. 直接赋值
    b := map[string]string{
    “sss”: “1”,
    “ss”: “2”,
    “ssss”: “3”,
    }
    fmt.Println(b)
    输出结果:
    map[ss:2 sss:1 ssss:3]

也是按照key从小到大排序,而且每一个key-value对后都要有“,”,包括最后一个的后面

map的增删查改

  1. map的增加和更新:
    b := map[string]string{
    “sss”: “1”,
    “ss”: “2”,
    “ssss”: “3”,
    }
    fmt.Println(b)
    b[“sss”] = “3”
    b[“sssss”] = “2”
    fmt.Println(b)
    输出结果:map[ss:2 sss:3 ssss:3 sssss:2]

可见b[“sss”] = “3”,若key存在,则修改,若key不存在,则添加

  1. 删除
    1. b := map[string]string{
      “sss”: “1”,
      “ss”: “2”,
      “ssss”: “3”,
      }
      fmt.Println(b)
      b[“sss”] = “3”
      b[“sssss”] = “2”
      fmt.Println(b)
      delete(b, “sss”)
      delete(b, “sss”)
      fmt.Println(b)
      输出结果:map[ss:2 ssss:3 sssss:2]

    可见,delete删除指定key的对,若没有这个key,也不会报错

    1. 如果想一次性删除全部,要么遍历map,用delete删除
      还可以给这个map直接重新make一个空间,让原来的空间成为垃圾被gc回收
  2. 查找
    value, find := b[“sssss”]
    fmt.Printf(“%v,%v”, value, find)
    若b中有sssss,则find返回true,value返回sssss对应的value;否则为false

    查询map总共有几对key-value对时,用len()函数来求即可

map的遍历

  1. 不能使用传统的for循环
  2. 只能使用for-range
    func main() {
    b := map[string]string{
    “sss”: “1”,
    “ss”: “2”,
    “ssss”: “3”,
    }
    for k, v := range b {
    fmt.Printf(“%v,%v\n”, k, v)
    }
    }
    输出结果:
    ssss,3
    sss,1
    ss,2

此时,k不再是索引,而是键key

map切片

[]数据类型是切片的类型,如果数据类型是map,那么这个切片就是map切片,使map的个数可以动态变化

map和切片都需要make后才能使用
代码:
func main() {
var stu []map[string]string = make([]map[string]string, 2)
stu[0] = make(map[string]string)
stu[0][“name”] = “zjw”
stu[0][“age”] = “19”
stu[1] = make(map[string]string)
stu[1][“name”] = “clw”
stu[1][“age”] = “19”
fmt.Println(stu)
stu2 := make(map[string]string)
stu2[“name”] = “yxn”
stu2[“age”] = “19”
stu = append(stu, stu2)
fmt.Println(stu)
}
输出结果:
[map[age:19 name:zjw] map[age:19 name:clw]]
[map[age:19 name:zjw] map[age:19 name:clw] map[age:19 name:yxn]]

map的使用细节

  1. map是引用类型,遵守引用类型的传递机制,函数接收map后,内部对map的操作会直接影响到函数外部
    func test(a map[string]string) {
    a[“s”] = “11”
    }
    func main() {
    b := map[string]string{
    “sss”: “1”,
    “ss”: “2”,
    “ssss”: “3”,
    }
    fmt.Println(b)
    test(b)
    fmt.Println(b)
    }
    输出结果:
    map[ss:2 sss:1 ssss:3]
    map[s:11 ss:2 sss:1 ssss:3]
  2. map的容量超标后,再想增加元素,会自动扩容,不像切片需要append。
  3. map的value常常是struct结构体的形式,这很高效,远比map的叠加好
    type Stu struct {
    name string
    age int
    }

func main() {
a := make(map[string]Stu, 2)
stu1 := Stu{“aaa”, 1}
stu2 := Stu{“bbb”, 2}
a[“stu1”] = stu1
a[“stu2”] = stu2
fmt.Println(a)
}
输出结果:
map[stu1:{aaa 1} stu2:{bbb 2}]

http://www.xdnf.cn/news/17193.html

相关文章:

  • 【Linux】重生之从零开始学习运维之主从MGR高可用
  • 【C++】unordered系列容器使用及封装
  • WebStorm转VSCode:高效迁移指南
  • QML开发:QML中的基本元素
  • 项目设计模式草稿纸
  • Docker概述
  • chromedp 笔记
  • Prometheus监控学习-安装
  • LeetCode 112. 路径总和解题思路详解(BFS算法深入理解)
  • pipeline方法关系抽取--课堂笔记
  • SpringBoot AI心理学训练实战
  • 《计算机“十万个为什么”》之 面向对象 vs 面向过程:编程世界的积木与流水线
  • FastAPI快速入门P2:与SpringBoot比较
  • Google AI 发布 MLE-STAR:一款能够自动执行各种 AI 任务的先进机器学习工程代理
  • 使标签垂直水平居中的多种方法
  • C#案例实战
  • 利用Coze平台生成测试用例
  • 基于vscode连接服务器实现远程开发
  • HTML总结全览
  • Go 单元测试:如何只运行某个测试函数(精确控制)
  • 【前端】网站favicon图标制作
  • Kubernetes 已弃用 `apps/v1beta1` 版本的 StatefulSet
  • @【JCIDS】【需求论证】联合能力集成与开发系统知识图谱
  • [数组]977.有序数组的平方;209.长度最小的子数组
  • 跨越系统孤岛:4A架构如何实现企业级一体化协同
  • 深度解析 TCP 三次握手与四次挥手:从原理到 HTTP/HTTPS 的应用
  • 【AI论文】iLRM:一种迭代式大型3D重建模型
  • Vue3视频播放组件自定义封装、控制是否自动播放、全屏小屏控制、loading加载、静音播放等样式完全自定义控制,代码复制即用
  • JAVA学习笔记 自增与自减的使用-006
  • uniapp转app时,cover-view的坑