欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > golang学习笔记18-map(映射)

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

2024/10/25 14:27:32 来源:https://blog.csdn.net/weixin_54259326/article/details/142517805  浏览:    关键词: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 mainimport "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 mainimport "fmt"func main() {// 创建一个map,key为string,value为stringm := 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) // 创建一个新的mapfmt.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) // 输出每个键值对}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com