golang学习笔记18-map(映射)

news2024/9/30 21:24:48

注:本人已有C,C++,Python基础,只写本人认为的重点。
go的map和C++的map类似,一些基本概念不做赘述。

一、语法

1.map定义的语法是:var 变量名 map[keytype]valuetype
2.map在使用前必须make
3.key和value的支持/不支持类型,常用类型如下所示:

支持类型不支持类型常用类型
Key基本数据类型、指针、结构体、数组、接口切片、映射、函数、管道stringint
Value所有类型stringint、结构体

key不能是切片,映射,函数,管道的共同原因是key必须是可比较类型,而这些类型是不可比较的,具体来说就是:
1.切片的底层数据结构包含指向数据的指针和长度信息,不能直接比较两个切片的内容。
2.映射的本质是一个键值对的集合,无法进行相等性比较。
3.函数的内存地址可能不同,即使它们的签名(函数名称、参数类型和返回类型的组合)相同,因此不能直接比较。
4.管道的本质是队列,不支持比较。

二、创建方式

package main

import "fmt"

func main() {
	//方式1:先定义后make,当然GC(go编译器)建议与make合并,即方式2
	//定义map变量:
	var a map[int]string
	//只声明map内存是没有分配空间
	//必须通过make函数进行初始化,才会分配空间:
	a = make(map[int]string, 10) //长度10,存放10个键值对
	//将键值对存入map中:
	a[20095452] = "张三"
	a[20095387] = "李四"
	//输出集合
	fmt.Println(a)
	//方式2:直接用make定义
	b := make(map[int]string)
	b[20095452] = "张三"
	b[20095387] = "李四"
	fmt.Println(b)
	//方式3:用make定义,定义时赋值
	c := map[int]string{
		20095452: "张三",
		20098765: "李四",
	}
	c[20095387] = "王五"
	fmt.Println(c)
}

三、操作

package main

import "fmt"

func main() {
	// 创建一个map,key为string,value为string
	m := make(map[string]string)

	// 1. 增加和更新操作
	m["name"] = "张三" // 添加键"name",值为"张三"
	m["age"] = "30"  // 添加键"age",值为"30"
	m["name"] = "李四" // 更新键"name",值改为"李四"
	fmt.Println("增加和更新后的map:", m)

	// 2. 删除操作
	delete(m, "age") // 删除键"age"
	fmt.Println("删除键'age'后的map:", m)

	// 尝试删除一个不存在的键
	delete(m, "nonexistent") // 不存在的键,什么都不发生
	fmt.Println("尝试删除不存在的键后的map:", m)

	// 3. 清空操作
	// 方法1:逐个删除
	for key := range m {
		delete(m, key) // 删除每个键
	}
	fmt.Println("逐个删除后,map应为空:", m)

	// 方法2:使用make创建新map,原来的将成为垃圾,被GC回收
	m = make(map[string]string) // 创建一个新的map
	fmt.Println("使用make后,map应为空:", m)

	// 4. 查找操作
	m["city"] = "北京"           // 添加一个新键值对
	value, exists := m["city"] // 查找键"city"
	if exists {
		fmt.Println("键'city'的值:", value) // 输出值
	} else {
		fmt.Println("键'city'不存在")
	}

	// 5. 获取长度
	fmt.Println("map的长度:", len(m)) // 输出map的长度

	// 6. 遍历操作
	m["country"] = "中国" // 再添加一些键值对
	m["province"] = "广东"
	fmt.Println("遍历map:")
	for key, value := range m {
		fmt.Printf("键: %s, 值: %s\n", key, value) // 输出每个键值对
	}
}

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

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

相关文章

Docker入门指南:快速学习Docker的基本操作

为什么需要Docker 有时我们在本地开发好程序并成功运行之后,却在服务器上运行不起来,通过观察日志通常会发现,哦原来是这个库没安装,于是我们就需要先安装需要用到的库,然后再启动服务你可能还会发现用到的数据库信息…

《Linux从小白到高手》理论篇(六):Linux软件安装一篇通

List item 本篇介绍Linux软件安装相关的操作命令,看完本文,有关Linux软件安装相关操作的常用命令你就掌握了99%了。 Linux软件安装 RPM RPM软件的安装、删除、更新只有root权限才能使用;查询功能任何用户都可以操作;如果普通用…

真正的Open AI ——LLaMA颠覆开源大模型

1. LLaMA 简介 LLaMA(Large Language Model Meta AI)是由Meta(原Facebook)推出的一个大型语言模型系列,旨在通过更小的模型规模和更少的计算资源,实现与其他主流语言模型(如GPT)相媲…

spring简短注入

新建bean 创建set方法 jpackage com.dependency.spring6.bean;import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class User {private static final Logger LOGGER LoggerFactory.getLogger(User.class);private String username;private String password;pr…

RPA跨流程复用元素技巧|实在RPA研究

为什么要跨流程复用元素 在 RPA 操作中,元素至关重要,因为自动化的本质就是模拟人类对元素的操作。基本上,每个流程都会包含若干个元素。对于同时维护多个流程的用户而言,相似的流程包,甚至是同一个元素。例如电商用户…

Solidworks斜接法兰快速绘制钣金箱体

Solidworks斜接法兰快速绘制钣金箱体 Chapter1 Solidworks斜接法兰快速绘制钣金箱体 Chapter1 Solidworks斜接法兰快速绘制钣金箱体 0.5mm间距为钣金焊接的预留焊缝。

Linux云计算 |【第四阶段】RDBMS1-DAY6

主要内容: MySQL索引(索引分类、创建索引)、用户及授权(创建用户并授权、查看授权、撤销授权、授权库mysql)、root密码恢复、备份、使用mysqldump进行逻辑备份、Percona 一、MySQL索引 1、基本概念 MySQL 索引(Inde…

给虚拟机安装操作系统以及无密码SSH登录

安装完虚拟化软件VMware Workstation Pro 17之后,我们下载了Ubuntu光盘映像文件,上次说演示desktop版的安装,但是考虑到后面要部署数据库,所以为了方便起见还是下载sever服务器版。 文件还挺大,在等待下载完成这会我们…

基于SpringBoot的休闲娱乐代理售票系统设计与实现

1.1研究背景 21世纪,我国早在上世纪就已普及互联网信息,互联网对人们生活中带来了无限的便利。像大部分的企事业单位都有自己的系统,由从今传统的管理模式向互联网发展,如今开发自己的系统是理所当然的。那么开发休闲娱乐代理售票…

C++那些事之内存优化

C那些事之内存优化 通常程序运行时内存是一个比较大的问题,如何减少内存占用和提升访问速度是至关重要。为了解决这些问题,C20 引入了 no_unique_address 特性,并结合空基类优化(EBO, Empty Base Optimization)&#x…

33 指针与数组:数组名与指针的关系、使用指针遍历数组、数组指针、指针数组、字符指针

目录​​​​​​​ 1 数组名与指针的关系 1.1 数组名 1.2 对数组名取地址 1.3 数组名与指针的区别 1.3.1 类型不同 1.3.2 sizeof 操作符的行为不同 1.3.3 & 操作符的行为不同 1.3.4 自增自减运算的行为不同 1.3.5 可变性不同 2 使用指针遍历数组 2.1 使用 *(nu…

智能网联汽车飞速发展,安全危机竟如影随形,如何破局?

随着人工智能、5G通信、大数据等技术的飞速发展,智能网联汽车正在成为全球汽车行业的焦点。特别是我国智能网联汽车市场规模近年来呈现快速增长态势,彰显了行业蓬勃发展的活力与潜力。然而,车联网技术的广泛应用也带来了一系列网络安全问题&a…

Mybatis知识

1. 基础知识 mybatis是基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动,创建连接,创建statement等繁杂的过程。 通过xml或者注解的方式将要执行的各种sta…

序列化方式五——ProtoStuff

介绍 Protostuff是一个基于Java的高效序列化库,它使用Protocol Buffers(简称protobuf)协议,为Java对象提供高效、灵活且易用的序列化和反序列化方法。Protostuff的主要优势在于其高性能和简单的使用方式,相对于其他序…

C#多线程数据同步的几种方式(不同的锁)

无锁 多个关联数据无法完整获取修改 internal class Program{static void Main(string[] args){Console.WriteLine("Hello, World!");ThreadPool.QueueUserWorkItem(Thread1);ThreadPool.QueueUserWorkItem(Thread2);ThreadPool.QueueUserWorkItem(Thread3);Console…

SpringBoot框架在墙绘产品展示中的运用

4 系统设计 墙绘产品展示交易平台的设计方案比如功能框架的设计,比如数据库的设计的好坏也就决定了该系统在开发层面是否高效,以及在系统维护层面是否容易维护和升级,因为在系统实现阶段是需要考虑用户的所有需求,要是在设计阶段没…

linux查看进程所在的目录

在Linux系统中,查看一个进程所在的目录(即该进程的可执行文件所在的目录)可以通过多种方式实现。 以下是查找进程的可执行文件路径的方法: 使用ls -l /proc/[pid]/cwd 你可以通过查看/proc/[pid]/cwd的符号链接来找到进程的可执…

UE5蓝图实战:动态墙上挖坑与自定义坑尺寸

在Unreal Engine 5.3中,我利用蓝图系统开发了一个创新的挖坑Demo,该Demo展示了如何在实时环境中动态地在墙体上挖坑,并允许用户自定义坑的大小。这一过程得益于UE5官方提供的Geometry Script插件,该插件通过蓝图接口实现了强大的网…

sql-labs:42~65

less42(单引号闭合、报错回显) login_useradmin login_password123 and if(11,sleep(2),1) # # 单引号闭合 ​ login_useradmin login_password123and updatexml(1,concat(0x7e,database(),0x7e),1)# # 报错回显…

端模一体,猎豹移动对大模型机器人发展路径清晰

今年世界机器人大会刚刚收官不久,接咖啡、拿苹果、摊煎饼……人形机器人在这届大会上备受关注,厂商们编排“整活”,展位几乎水泄不通。 自从AI大模型开始全面改变市场开始,关于机器人的方向性争论就不绝于耳,就在最近的…