Golang map笔记

news2024/10/1 5:35:19

map定义

三种方式

package main

import "fmt"

func main() {
    // map 的基本定义
    // 第一种方式 使用make分配数据空间
    var map1 map[string]string
    map1 = make(map[string]string, 3)
    map1["no1"] = "北京"
    map1["no2"] = "天津"
    map1["no3"] = "上海"
    fmt.Println("map1=", map1)

    // 第二种方式
    map2 := make(map[string]string)
    map2["no1"] = "宋江"
    map2["no2"] = "卢俊义"
    map2["no3"] = "吴用"
    fmt.Println("map2=", map2)

    // 第三中方式,使用类型推导
    map3 := map[string]string{
        "no1": "刘备",
        "no2": "关羽",
        "no3": "张飞",
    }
    fmt.Println("map3=", map3)

    // 套娃方式
    map4 := map[string]map[string]string{
        "no1": {"name": "张三", "gender": "男", "address": "北京"},
        "no2": {"name": "李四", "gender": "女", "address": "天津"},
        "no3": {"name": "王五", "gender": "男", "address": "上海"},
    }
}

map删除

删除单个key

delete(map, "key"),delete是内置函数。如果key存在,就删除key-value,如果key不存在,也不会报错。

delete(map1, "no2")

删除全部key

  1. Golang没有提供一次性全部删除的函数,只能遍历全部删除

for i, _ := range map1 {
    delete(map1, i)
}
  1. make一个新的空间

map1 = make(map[string]string)

判断某个key是否存在

val, exists := map1["no4"] // exists返回布尔值,存在为true,不存在为false
if exists {
    fmt.Println("exists")
} else {
    fmt.Println("nonexistence")
}
fmt.Printf("val=%v,exists=%v\n", val, exists)

map遍历

使用 for range遍历即可,多层map,for range多次即可

map 长度

使用len函数

map 切片的使用

package main

import "fmt"

func main() {
    // map 切片的使用
    map1 := make([]map[string]string, 2)
    if map1[0] == nil {
        map1[0] = make(map[string]string, 2)
        map1[0]["name"] = "宋江"
        map1[0]["age"] = "45"
    }
    if map1[1] == nil {
        map1[1] = make(map[string]string, 2)
        map1[1]["name"] = "卢俊义"
        map1[1]["age"] = "40"
    }
    // 由于切片只分配了2个空间,再追加map的话需使用append函数
    mapValue := map[string]string{
        "name": "吴用",
        "age":  "44",
    }
    map1 = append(map1, mapValue)

    fmt.Println(map1)

}

运行结果:

[map[age:45 name:宋江] map[age:40 name:卢俊义] map[age:44 name:吴用]]

map 细节

  1. map是引用类型,遵守引用类型传递的机制,在一个函数中接受map,修改后,会直接修改原来的map

package main

import "fmt"

func modifyMap(map1 map[int]int) {
    map1[10] = 200
}

func main() {
    // map 函数值传递的演示
    map1 := map[int]int{
        1:  11,
        2:  22,
        10: 100,
    }
    fmt.Println(map1)
    modifyMap(map1) // 调函数后,会修改原下标10的值
    fmt.Println(map1)
}
  1. map可以自动扩容,并不会报panic,这点和切片不同(切片超过容量必须使用append)

package main

import "fmt"

func main() {
    // map 自动扩容的演示
    map1 := make(map[int]int, 2) // 定义2个容量
    map1[1] = 11
    map1[2] = 22
    map1[3] = 33 // 超过2个容量会自动扩容,不会报panic
    map1[4] = 44
    fmt.Println(map1)
}
  1. map的value经常使用结构体struct类型,更灵活,也更适合管理复杂的数据

package main

import "fmt"

type Stu struct {
    Name  string
    Age   int
    Score float32
}

func main() {
    // map struct类型的演示
    stuents := make(map[string]Stu)
    stu1 := Stu{"宋江", 18, 67.00}
    stu2 := Stu{"卢俊义", 19, 50.50}
    stu3 := Stu{"吴用", 20, 99.00}
    stuents["no1"] = stu1
    stuents["no2"] = stu2
    stuents["no3"] = stu3
    for i, v := range stuents {
        fmt.Printf("学生编号:%v,名字:%v,年龄:%v,分数:%v\n", i, v.Name, v.Age, v.Score)
    }
}

课堂练习

要求:

  1. 使用map[string]map[string]string类型

  1. key是唯一的,不可以重复

  1. 如果某个用户存在,修改他的密码为:888888;如果不存在新增用户

package main

import "fmt"

func modifyPwd(users map[string]map[string]string, name string) {
    exists := false
    for i, v := range users {
        if v["name"] == name {
            users[i]["pwd"] = "888888"
            exists = true
        }
    }
    if !exists {
        users["no3"] = map[string]string{
            "name": name,
            "pwd":  "888888",
        }
    }
}

func main() {
    users := make(map[string]map[string]string)
    user1 := map[string]string{
        "name": "tom",
        "pwd":  "123456",
    }
    user2 := map[string]string{
        "name": "mary",
        "pwd":  "987654",
    }
    users["no1"] = user1
    users["no2"] = user2
    modifyPwd(users, "lily")
    fmt.Println(users)
}

运行结果:

map[no1:map[name:tom pwd:123456] no2:map[name:mary pwd:987654] no3:map[name:lily pwd:888888]]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/338366.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql 增删改查(二)—— 增(insert)、删(delete)、改(update)

目录 一、插入 1、insert 2、replace(插入否则更新) 二、更新(update) 三、删除 1、delete 2、truncate(截断表,慎用) 一、插入 1、insert (1) 单行 / 多行插入 全列插入:…

可能是最强的Python可视化神器,建议一试!

数据分析离不开数据可视化,我们最常用的就是Pandas,Matplotlib,Pyecharts当然还有Tableau,看到一篇文章介绍Plotly制图后我也跃跃欲试,查看了相关资料开始尝试用它制图。 1.Plotly Plotly是一款用来做数据分析和可视…

毕业四年换了3份软件测试工作,我为何仍焦虑?

​今天一看日历:2023.2.11 ,才突然意识到自己毕业已经四年了。四年时间里一直在测试行业摸爬滚打,现在是时候记录一下了。 下面我来分享下我这4年软件测试经验及成长历程,或许能帮助你解决很多工作中的迷惑。 01、我是如何开始做…

libevent 实现httpserver 终极版C/C++

最近要用C实现哥httpserver,之前探索了很多个http的库。 1. 我之前最习惯用httplib-cpp github.comhttps://github.com/yhirose/cpp-httplib 但是它要求gcc-g版本要大于4.8。然后我用了6.1.0之后,我的其他库比如mysql glog之后怎么都链接不上。换了系统&a…

Https 协议超强讲解(二)

浏览器是如何确保 CA 证书的合法性? 1. 证书包含什么信息? 颁发机构信息 公钥 公司信息 域名 有效期 指纹 …… 2. 证书的合法性依据是什么? 首先,权威机构是要有认证的,不是随便一个机构都有资格颁发证书&am…

【MySQL】第十六部分 MySQL数据类型详解

【MySQL】第十六部分 MySQL数据类型详解 文章目录【MySQL】第十六部分 MySQL数据类型详解16. MySQL数据类型详解16.1 整数类型16.2 浮点类型16.3 定点数类型16.4 位类型 BIT16.5 日期和时间类型16.6 文本字符串类型16.6.1 CHAR VS VARCHAR类型16.6.2 TEXT类型16.6.3 ENUM类型16…

文件管理(9)

文件管理 0 引言 为什么要引入文件系统? 信息管理的需要:用户面前提供一种规格化的机制,方便用户对文件的存取、提高效率。操作系统本身需要–操作系统本身也不是常驻内存的,也有大量的信息需要存于外存。 1 文件定义 文件&a…

Python语言零基础入门教程(十四)

Python 日期和时间 Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能。 Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间。 时间间隔是以秒为单位的浮点小数。 每个时间戳都以自从1970年1月1日午夜(历元&…

Linux上面配置Apache2支持Https(ssl)具体方案实现

虽然Nginx比较流行,但是由于一些老项目用到了Apache2来支持Web服务,最近想给服务上一个Https支持,虽然看似教程简单,但是也遇到一些特殊情况,经历了一番折腾也算是解决了所有问题,将过程记录如下。演示是基…

亿级高并发电商项目-- 实战篇 --万达商城项目 三(通用模块、商品服务模块、后台API模块、IDEA忽略文件显示等开发工作

专栏:高并发项目 👏作者简介:大家好,我是小童,Java开发工程师,CSDN博客博主,Java领域新星创作者 📕系列专栏:前端、Java、Java中间件大全、微信小程序、微信支付、若依框…

4.SpringWeb

一、创建项目LomBok:辅助开发工具,减少代码编写Spring Web:带上Spring MVC,可以做Web开发了Thymleaf: Web开发末班引擎(不常用)创建好,如下:static/ 放置静态资源的根目录templates/ 放置模板文件的根目录 二、资源配置…

新来的23岁软件测试员上来秀了波操作,把几个老员工看傻了

春招了,公司来了个小伙子,一看简历,嘿?22岁,这不刚毕业的小毛孩子嘛,结果没想到人家上来就把现有项目的性能优化了一遍,给公司节省了一半的成本,这种“王炸”打法,直接给…

152、【动态规划】leetcode ——416. 分割等和子集:滚动数组+二维数组(C++版本)

题目描述 原题链接:416. 分割等和子集 解题思路 题目要求是划分出两个相等的集合,那么这两个相等的集合相加,一定等于偶数并且为总集合的二分之一,若总集合求和后不为偶数,则一定不可以划分,直接返回fals…

黄绮珊“绮望三十”巡回演唱会3月4日广州中山纪念堂暖春开唱!

•中年成名 四十余载静待盛放歌手黄绮珊,1991年正式进入歌坛,至今已满三十周年。黄绮珊前半生的歌手之路好像并不是那么顺畅。虽然一直有着华语乐坛的顶尖歌唱实力,但在45岁之前,黄绮珊一直处于“歌红人不红”的状态。不少人听过黄…

GPU服务器安装显卡驱动、CUDA和cuDNN

GPU服务器安装cuda和cudnn1. 服务器驱动安装2. cuda安装3. cudNN安装4. 安装docker环境5. 安装nvidia-docker25.1 ubuntu系统安装5.2 centos系统安装6. 测试docker容调用GPU服务1. 服务器驱动安装 显卡驱动下载地址https://www.nvidia.cn/Download/index.aspx?langcn显卡驱动…

Zabbix 构建监控告警平台(三)

Zabbix User parametersZabbix Trigger1.Zabbix User parameters 1.1即自定义KEY 注意:mysql安装在被监测主机 [rootlocalhost ~]# yum -y install mariadb-server mariadb [rootlocalhost ~]# systemctl start mariadb [rootlocalhost ~]# mysqladmin -uroot statu…

[electron] 一 vue3.2+vite+electron 项目集成

一 开发环境系统:windows开发工具: git , vscode,termial环境依赖: node, npm 二 步骤2.1 通过vite 创建vue项目通过 终端执行命令,选择 模板 vuenpm init vite cd 项目目录 npm install npm run dev2.2 集成 electro…

T06 成绩排序

查找和排序 题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩 都按先录入排列在前的规则处理。 示例: jack 70 peter 96 Tom 70 smith 67 从高到低 成…

LC-70-爬楼梯

原题链接:爬楼梯 个人解法 思路: 动态规划 状态表示:f[i]表示走到第n阶台阶有几种方法 状态转移:f[i] f[i -1] f[i - 2] 这实际上就是斐波那契数列,通过转移可以看到,我们只用了三个变量,故…

Java、JSP职工人事管理系统设计与实现

技术:Java、JSP等摘要:现在随着我们这个社会的计算机技术的快速发展,计算机在企业管理中得到普遍的应用,现在我们利用计算机在实现企业职工的管理越来越重要。当今社会是快速发展的信息社会,自动化信息的作用也变得越来…