golang:map的定义操作排序以及map切片(代码片段)

保暖大裤衩LeoLee 保暖大裤衩LeoLee     2022-11-05     377

关键词:

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数组是同一种数据类型的固定长度的序列。数组是值类型,因此改变副本的值,不会改变本身的值;当作为方法的入参传入时将复制一份数组而不是引用同... 查看详情