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删除
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