首页 > 其他分享 >golang 映射(map)

golang 映射(map)

时间:2023-02-24 11:24:40浏览次数:32  
标签:map 映射 fmt golang map1 m1 key make

1. 映射的定义

map是一种无序的基于key-value的数据结构,Go语言中map是引用类型,必须初始化(make)才能使用。

map定义: map[KeyType]ValueType
其中,KeyType表示键的类型,ValueType表示对应值的类型。

map中,key值是不可以重复的,(若重复了以最后一个key-value为主)value值可以重复。

map类型变量默认初始值为 nil,要使用make()函数分配内存。
make语法 : make(map[KeyType]ValueType, [cap])
其中,cap为map的容量,参数不是必须给的。

2.map声明方式

2.1 方式一

package main

import "fmt"

func main() {
	var m1 map[string]int     //定义map变量,只声明是不会分配内存的。
	m1 = make(map[string]int) ////必须通过make函数进行初始化,才会分配空间。
	m1["a"] = 1               //
	m1["b"] = 2
	m1["c"] = 3
	m1["d"] = 4
	m1["a"] = 5 //key重复,会以最后一个key对应的val为准。
	fmt.Printf("map1的值为:%v\n", m1)
}

执行结果

map的值为:map1[a:5 b:2 c:3 d:4]

2.2 方式二

package main

import "fmt"

func main() {
	m2 := make(map[string]int)
	m2["s1"] = 0
	m2["s2"] = 1
	m2["s3"] = 2
	fmt.Printf("map2的值为:%v\n", m2)
}

执行结果

map2的值为:map[s1:0 s2:1 s3:2]

2.3 方式三

package main

import "fmt"

func main() {
	m3 := map[string]int{
		//赋值格式(key : val ,) 注意:最后的,不能少
		"s1": 1,
		"s2": 2,
	}
	fmt.Printf("map3的值为:%v\n", m3)
}

执行结果

map3的值为:map[s1:1 s2:2]

3. map的增删改查操作

3.1 map增加和修改

map["key"] = value
如果 key 还没有,就是增加,如果 key 存在就是修改。

package main

import "fmt"

func main() {
	var m1 map[string]int     //定义map变量,只声明是不会分配内存的。
	m1 = make(map[string]int) ////必须通过make函数进行初始化,才会分配空间。
	m1["a"] = 1               //
	m1["b"] = 2
	m1["c"] = 3
	fmt.Printf("map1的值为:%v\n", m1)
	m1["d"] = 4 //增加,key不同就是增加
	fmt.Printf("map1的值为:%v\n", m1)
	m1["a"] = 5 //修改:key重复,就会修改val的值
	fmt.Printf("map1的值为:%v\n", m1)
}

执行结果

map1的值为:map[a:1 b:2 c:3]
map1的值为:map[a:1 b:2 c:3 d:4]
map1的值为:map[a:5 b:2 c:3 d:4]

3.2 map删除

image
delete(map,"key")
delete 是一个内置函数,如果 key 存在,就删除该 key-value,如果 key 不存在, 不操作,但是也不会报错

清空map:

  • 没有一个专门的方法一次删除,可以遍历一下key,逐个删除。
  • 重新将原来的map遍历,make一个新的,让原来的成为垃圾,被gc回收。
package main

import "fmt"

func main() {
	var m1 map[string]int     //定义map变量,只声明是不会分配内存的。
	m1 = make(map[string]int) ////必须通过make函数进行初始化,才会分配空间。
	m1["a"] = 1               //
	m1["b"] = 2
	m1["c"] = 3
	fmt.Printf("map1的值为:%v\n", m1)
	delete(m1, "a") //删除key为a的key和val
	fmt.Printf("map1的值为:%v\n", m1)
	delete(m1, "d") //删除key为d的key和val,由于没有为d的key值,所以不会操作
	fmt.Printf("map1的值为:%v\n", m1)
		for k1, _ := range m1 { //循环清空所有的key
		delete(m1, k1)
	}
	fmt.Printf("map1的值为:%v\n", m1)
}

执行结果

map1的值为:map[a:1 b:2 c:3]
map1的值为:map[b:2 c:3]
map1的值为:map[b:2 c:3]
map1的值为:map[] 

3.3 map查询

value ,bool = map[key]
value为返回的value,key不存在value返回对应数据类型的默认值。
bool为是否返回,key存在返回true,key不存在返回false。

package main

import "fmt"

func main() {
	var m1 map[string]int     //定义map变量,只声明是不会分配内存的。
	m1 = make(map[string]int) ////必须通过make函数进行初始化,才会分配空间。
	m1["a"] = 1               //
	m1["b"] = 2
	m1["c"] = 3
	m1["d"] = 4
	fmt.Printf("map1的值为:%v\n", m1)
	val1, bool1 := m1["a"] //bool1为返回,存在为true,不存在为flase,val1存在则返回对应的val值,不存在返回val对应类型的默认值
	val2, bool2 := m1["e"]
	fmt.Println(val1, bool1)
	fmt.Println(val2, bool2)
}

执行结果

map1的值为:map[a:1 b:2 c:3 d:4]
1 true 
0 false

4. map的遍历

package main

import (
	"fmt"
)

func main() {
	m3 := make(map[string]string)
	m3["a"] = "a"
	m3["b"] = "b"
	m3["c"] = "c"
	for k1, v1 := range m3 {
		fmt.Printf("m3[%v]=%v\n", k1, v1)
	}
}

执行结果

m3[c]=c
m3[a]=a
m3[b]=b

标签:map,映射,fmt,golang,map1,m1,key,make
From: https://www.cnblogs.com/LI-XinYu/p/17150287.html

相关文章

  • mapstruct无法生成实现类
    在网上搜了一下,看到一个标题,mapstruct和lombok之类的,突然想起来之前我也遇到过这个问题,就是因为这两个框架同时使用,但是因为没有指定编译顺序,mapstruct先编译,lombok后编译,g......
  • bitmap
    Jarrycow.github.io/source/_posts/高速流量测量方法.md网络测量常见算法之一:直接位图法DirectBitmapVirtualBitmapMultiresolutionBitmap......
  • 深入学习jquery源码之map()
    概述将一组元素转换成其他数组(不论是否是元素数组)你可以用这个函数来建立一个列表,不论是值、属性还是CSS样式,或者其他特别形式。这都可以用'$.map()'来方便的建立。参数call......
  • JavaScript 中 Object,Map,Set 及数组遍历方法
    Object(对象)forin遍历出对象可枚举的"属性",包含继承的可枚举属性varperson={name:'小明',birth:1990,height:1.70};for(varxinperson){consol......
  • golang-小技巧:slice与sort包
    s1:=make([]string,2)s1[0]="good"s1[1]="morning"//根据val寻找下标i:=sort.SearchStrings(s1,"morning")fmt.Println(i)so......
  • Mapstruct 使用教程
    前言MapStruct是一个Java注释处理器,用于生成类型安全的bean映射类。您要做的就是定义一个映射器接口,该接口声明任何必需的映射方法。在编译期间,MapStruct将生成此接口的......
  • python 操作 ES 二、mappings
    环境python:3.8es:7.8.0环境安装pipinstallelasticsearch==7.8.0  fromelasticsearchimportElasticsearch#环境python:3.8es:7.8.0#环境安装#pipinstal......
  • CodeFirst同时映射多种数据库及分表优化设计
    开发环境:Windows10专业版、VisualStudioCode、.Net6、SqlSugar5.x、Navicat根据需求,对数据处理时,部分用到Sqlite进行增删改查、部分用到MySql进行增删改查问题1:对于......
  • golang 切片
    1.切片的定义切片(slice)是对数组一个连续片段的引用,所以切片是一个引用类型。切片的使用与数组类似,遍历,访问切片元素等都一样。切片是长度是可以变化的,因此切片可以看做......
  • 关于数组的map、filter、every、some、find、findIndex、 includesd几个方法实现原理
    map方法原理//map遍历格式所有项并返回一个新数组Array.prototype.myMap=function(callback){letarr=[];for(leti=0;i<this.length;i++){ar......