关键词:
map概述
golang中的引用类型。
与其他语言中的map类型基本相似,都是k-v形式的,k不可重复,元素是无序的,并且支持扩容。
基本语法
var 变量名 map[keytype]valuetype
key可以是很多类型
bool、数字、string、指针、channel,还可以是只包含前面几种类型的 接口、结构体、数组。
但是!!!slice、map、function是不可以作为map的key,因为无法使用 == 判断key是否相等。
value的类型就没有特别的要求
声明
map的声明是不会分配内存的,初始化需要make,分配内存后才能赋值和使用。
map的声明示例
package main
import "fmt"
//声明一个map变量
var map1 map[string]string
func main()
//第一种方式:先声明,再make
fmt.Printf("map1=%v\\n", map1)
fmt.Printf("map1 address=%p\\n", &map1) //变量map1是有内存地址的
fmt.Printf("map1==nil? %v\\n", map1 == nil) //在没有make之前map1==nil为true成立,代表没有分配内存空间
//使用map要先make
map1 = make(map[string]string, 2) //分配了2个空间
map1["LeoLee"] = "18"
fmt.Printf("map1=%v, length=%d\\n", map1, len(map1))
map1["Lydia"] = "18"
fmt.Printf("map1=%v, length=%d\\n", map1, len(map1))
map1["LeoLee"] = "26"
fmt.Printf("map1=%v, length=%d\\n", map1, len(map1))
map1["Tony"] = "1" //map会自动扩容
fmt.Printf("map1=%v, length=%d\\n", map1, len(map1))
//第二种方式:声明map变量的同时,make
map2 := make(map[string]int) //这里不定义初始size,根据内置函数make的api说明,会分配一个默认起始大小:0
fmt.Printf("map2=%v, length=%d\\n", map2, len(map2))
map2["a"] = 1
map2["b"] = 2
fmt.Printf("map2=%v, length=%d\\n", map2, len(map2))
//第三种方式:声明直接赋值
map3 := map[int]string
1: "c",
2: "d",
fmt.Printf("map3=%v, length=%d\\n", map3, len(map3))
操作map
map的增删改查、以及循环遍历(map只能使用for range遍历):
package main
import "fmt"
func main()
//map删除元素,使用内置函数delete
map1 := map[string]string
"a": "欸",
"b": "币",
"c": "西",
delete(map1, "a") // 若map为nil或无此元素,delete不进行操作
delete(map1, "d")
fmt.Printf("map1=%v, length=%d\\n", map1, len(map1))
//golang的map没有办法一次性删除所有的key-value,需要遍历删除
for k, _ := range map1
delete(map1, k)
fmt.Printf("map1=%v, length=%d\\n", map1, len(map1))
//或者对该map变量重新进行make初始化(指向新的内存地址),让该map变量对应的原来的引用对象成为垃圾。
map1 = make(map[string]string)
fmt.Printf("map1=%v, length=%d\\n", map1, len(map1))
//获取对应key的value
map2 := map[string]string
"a": "欸",
"b": "币",
"c": "西",
val1, getRes1 := map2["a"]
fmt.Printf("key:a, value:%s, getRes1:%v\\n", val1, getRes1)
val2, getRes2 := map2["d"]
fmt.Printf("key:d, value:%s, getRes2:%v\\n", val2, getRes2)
//遍历,map的遍历只能使用for range方式
for k, v := range map2
fmt.Println(k, v)
map切片
map切片类似于Java中的List<Map>或者是Array<Map>
package main
import "fmt"
//map切片,类似于Java中List<Map>
func main()
personSlice := make([]map[string]string, 2, 2)
personSlice[0] = make(map[string]string)
personSlice[0]["name"] = "LeoLee"
personSlice[0]["age"] = "26"
personSlice[1] = make(map[string]string)
personSlice[1]["name"] = "Lydia"
personSlice[1]["age"] = "29"
//如果继续追加,会有越界
/*personSlice[2] = make(map[string]string)
personSlice[2]["name"] = "Lydia"
personSlice[2]["age"] = "29"*/
//所以需要使用slice的append,这样切片可以动态扩容
personMap1 := make(map[string]string)
personMap1["name"] = "Tony"
personMap1["age"] = "30"
personSlice = append(personSlice, personMap1)
for _, m := range personSlice
fmt.Println(m)
map的排序
由于Golang中没有提供原生的有序map,所以Golang中的有序map需要开发者自己实现,以下是一个对map进行有序输出的小例子:
package main
import (
"fmt"
"sort"
)
//map排序
func main()
//在老版本中,使用print输出map也会是无序的,新版本中变为升序
//但是遍历map仍然是无序的
map1 := map[int]string
3: "b",
2: "a",
6: "c",
5: "e",
fmt.Println("map1=", map1)
for k, v := range map1
fmt.Printf("%d:%s\\n", k, v)
map2 := make(map[string]string)
map2["b"] = "1"
map2["a"] = "4"
map2["g"] = "2"
map2["f"] = "8"
fmt.Println("map2=", map2)
for k, v := range map2
fmt.Printf("%s:%s\\n", k, v)
//对map进行排序
/*1.先将map的key放入切片中
2.对切片进行排序
3.遍历切片,按照切片遍历的顺序获取key对应的value*/
var keys1 []int
for k, _ := range map1
keys1 = append(keys1, k)
fmt.Printf("keys1=%v\\n", keys1)
//使用sort包下的Ints函数,Ints函数将会把传入的int类型切片按照递增顺序排序
sort.Ints(keys1)
fmt.Printf("keys1=%v\\n", keys1)
for _, key := range keys1
val, _ := map1[key]
fmt.Println(key, ":", val)
golang:map的定义操作排序以及map切片(代码片段)
map概述golang中的引用类型。与其他语言中的map类型基本相似,都是k-v形式的,k不可重复,元素是无序的,并且支持扩容。基本语法var变量名map[keytype]valuetypekey可以是很多类型bool、数字、string、指针、channel,... 查看详情
golangm20234topic(代码片段)
...c;并在函数中修改所指向的值3交换两个变量的值map声明和定义map基本操作通过key访问map中的元素判断map指定的key是否存在?map遍历map删除map是引用类型map进行排序map类型的切片统计一个字符串每个单词出现的次数写一个程序&... 查看详情
golang学习之路—map切片(代码片段)
map切片基本介绍案例演示基本介绍切片的数据类型如果是map,则我们称为sliceofmap,map切片,这样使用则map个数就可以动态变化了。案例演示要求:使用一个map来记录学生的信息name和age,即一个学生对应一个map,并且... 查看详情
golang简明入门进阶指南02数组切片map类型的基础使用(代码片段)
五、集合类型5.1数组数据定义funcdefArray() //定义数组,默认赋值0 vararr1[5]int fmt.Println("initvalofarr1=",arr1) arr1=[5]int1,3,4,5 fmt.Println(arr1) //定义数组并赋予初始值 vararr2=[3]int1,3,4 arr3:=[ 查看详情
golang基础——map数组切片存放不同类型的数据(代码片段)
基础知识,不解释,直接看代码packagemainimport( "fmt")typeUserstruct IDstring Namestring Ageintfuncmain() fmt.Println("-------------------map-------------------------") data:=map[st 查看详情
golang基础——map数组切片存放不同类型的数据(代码片段)
基础知识,不解释,直接看代码packagemainimport( "fmt")typeUserstruct IDstring Namestring Ageintfuncmain() fmt.Println("-------------------map-------------------------") data:=map[st 查看详情
golang学习五·五:指针&切片&字典&结构体(代码片段)
文章目录一、指针:1.Go语言中的指针:2.栈帧:2.1计算机内存区域划分:2.2栈帧:3.函数new4.指针作为函数参数:4.1函数传值:4.2例:4.指针使用注意:二、slice--切片:1.切片简述:2.创建slice:2.1声明slice与array的区别:2.2经常使用的创建slice的... 查看详情
golang在多个goroutine中进行map或者slice操作应该注意的对象。
因为golang的map和列表切片都是引用类型,且非线程安全的,所以在多个goroutine中进行读写操作的时候,会产生“mapreadandmapwrite“的panic错误。 某一些类型的对象,会有这种类似的set方法来写数据,或者get方法来返回一个map:fun... 查看详情
golang语言map的并发和排序
参考技术Agolang语言map的并发和排序golang缺省的map不是threadsafe的,如果存在读写并发的使用场景,必须在外面使用lock机制。包sync里面引入一个安全map;用法:运行结果如下:golang官方说法map并不排序,不按key排序,也不按插入... 查看详情
golang基础:gomodule,forrange,切片,map,struct等使用和实现(代码片段)
文章目录Go程序结构项目结构可执行程序库项目GoModule构建模式GoModule的常规操作1.添加依赖2.升级/降级依赖3.添加一个主版本号大于1的依赖4.删除依赖5.vendor相关入口函数与包初始化:搞清Go程序的执行次序init函数的用途使用... 查看详情
老奶奶可以看懂系列之---golang的map映射(代码片段)
前言这里总结的Golang笔记只适合有点编程基础的人看,比如Java往期内容:Golang学习【day1】变量、类型Golang学习,指针,循环控制相关循环结构控制、包函数的使用异常处理、数组老奶奶可以看懂的切片MapMap特点... 查看详情
golang基础:gomodule,forrange,切片,map,struct等使用和实现(代码片段)
文章目录Go程序结构项目结构可执行程序库项目GoModule构建模式GoModule的常规操作1.添加依赖2.升级/降级依赖3.添加一个主版本号大于1的依赖4.删除依赖5.vendor相关入口函数与包初始化:搞清Go程序的执行次序init函数的用途使用... 查看详情
go入门教程2内置基础类型(boolean数值字符串错误类型),分组,iota枚举,array(数值),slice(切片),map(字典),make/new操作,零值
这小节我们将要介绍如何定义变量、常量、Go内置类型以及Go程序设计中的一些技巧。定义变量Go语言里面定义变量有多种方式。使用var关键字是Go最基本的定义变量方式,与C语言不同的是Go把变量类型放在变量名后面://定义一... 查看详情
golang:切片的声明初始化以及操作示例,详解概括(代码片段)
Golang基础学习项目地址:https://github.com/LeoLeeWithWarmPants/golangStudyhttps://github.com/LeoLeeWithWarmPants/golangStudy概述slice本质上是一个数据结构(struct结构体)。切片是数组的一个引用,即切片的底层是一个数组 查看详情
golang:切片的声明初始化以及操作示例,详解概括(代码片段)
Golang基础学习项目地址:https://github.com/LeoLeeWithWarmPants/golangStudyhttps://github.com/LeoLeeWithWarmPants/golangStudy概述slice本质上是一个数据结构(struct结构体)。切片是数组的一个引用,即切片的底层是一个数组 查看详情
golang中sync.map的实现原理
参考技术A前面,我们讲了map的用法以及原理Golang中map的实现原理,但我们知道,map在并发读写的情况下是不安全。需要并发读写时,一般的做法是加锁,但这样性能并不高,Go语言在1.9版本中提供了一种效率较高的并发安全的syn... 查看详情
mapreduce阶段源码分析以及shuffle过程详解
...S -计算切片时,计算最小切片数(默认为1,可自定义)和最大切片数(默认是long的最大值,可以自定义) -查看给定的是否是文件,如果是否目录计算目录下所有文件的切片 -通过block大小和最小切片数... 查看详情
go语言学习笔记数组&切片&map
加Golang学习QQ群共同学习进步成家立业工作^-^群号:96933959数组 Arrays数组是同一种数据类型的固定长度的序列。数组是值类型,因此改变副本的值,不会改变本身的值;当作为方法的入参传入时将复制一份数组而不是引用同... 查看详情