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

注:本人已有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) // 输出每个键值对
	}
}

GoLang学习笔记主要包括以下几个方面: 1. 语法规则:Go语言要求按照语法规则编写代码,例如变量声明、函数定义、控制结构等。如果程序中违反了语法规则,编译器会报错。 2. 注释:Go语言中的注释有两种形式,分别是行注释和块注释。行注释使用`//`开头,块注释使用`/*`开头,`*/`结尾。注释可以提高代码的可读性。 3. 规范代码的使用:包括正确的缩进和空白、注释风格、运算符两边加空格等。同时,Go语言的代码风格推荐使用行注释进行注释整个方法和语句。 4. 常用数据结构:如数组、切片、字符串、映射(map)等。可以使用for range遍历这些数据结构。 5. 循环结构:Go语言支持常见的循环结构,如for循环、while循环等。 6. 函数:Go语言中的函数使用`func`关键字定义,可以有参数和返回值。函数可以提高代码的重用性。 7. 指针:Go语言中的指针是一种特殊的变量,它存储的是另一个变量的内存地址。指针可以实现动态内存分配和引用类型。 8. 并发编程:Go语言提供了goroutine和channel两个并发编程的基本单位,可以方便地实现多线程和高并发程序。 9. 标准库:Go语言提供了丰富的标准库,涵盖了网络编程、文件操作、加密解密等多个领域,可以帮助开发者快速实现各种功能。 10. 错误处理:Go语言中的错误处理使用`defer`和`panic`两个关键字实现,可以有效地处理程序运行过程中出现的错误。 通过以上内容的学习,可以掌握Go语言的基本语法和编程思想,为进一步学习和应用Go语言打下坚实的基础。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Golang学习笔记](https://blog.csdn.net/weixin_52310067/article/details/129467041)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [golang学习笔记](https://blog.csdn.net/qq_44336275/article/details/111143767)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

技术卷

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

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

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

打赏作者

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

抵扣说明:

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

余额充值