map主要由键值对(”key = value”)字符串组成。
map的定义:
Map是Go里面的键值对集合,由key-value对组成,给定key,可以快速定位到对应的value。也被称为字典、哈希表等。
map中的key可以是任意能够用==或者!=操作符比较的类型,比如string,int、float等,不能是函数、map、切片;value可以是任意类型
map的声明方式var map变量名 map[key类型]vlaue类型。
可以使用内建函数 make 也可以使用 map 关键字来定义 Map:
/* 声明变量,默认 map 是 nil */
var map_variable map[key_data_type]value_data_type
/* 使用 make 函数 */
map_variable := make(map[key_data_type]value_data_type)
1、声明一个nil的map类型
package main
import "fmt"
func main() {
//声明一个map类型的键值对,是nil类型
var a map[string]int
fmt.Println(a,a==nil)
//输出结果 map[] true
2、先声明类型,再给map赋值,使用等号
//给map类型赋值
var b =make(map[string]int,8)
fmt.Println(b,b==nil)
//输出结果 map[] false
b["GO语言"] = 100
b["GIN框架"] = 200
fmt.Printf("b的值:%v,类型是:%T\n",b,b)
//输出结果 b的值:map[GIN框架:200 GO语言:100],类型是:map[string]int
fmt.Printf("b的值:%#v,类型是:%T\n",b,b) //加#会显示出更多的输出
//输出结果:b的值:map[string]int{"GIN框架":200, "GO语言":100},类型是:map[string]int
3、声明后直接赋值,赋值是键值对格式,用冒号
//声明后就赋值
var c = map[string]int{
"GO语言" :100 , //注意这里是:不是=
"GIN框架" :200, //不加,号 需要把大括号移上来
}
fmt.Println(c)
//输出结果:map[GIN框架:200 GO语言:100]
}
4、判断字段在不在map中
var d = map[string]int{
"GO语言": 100,
"GIN框架": 200,
}
fmt.Println(d)
value,ok := d["GO语言"] //语法,判断map中是否存在字段,同时value会变成键值,ok会变成bool类型,
// 只有false和true,value和ok是自定义的,格式对即可
fmt.Println(value,ok)
//输出:100 true
if ok {
fmt.Println("GO语言在map中")
}else {
fmt.Println("GO语言不在map中")
}
//输出:GO语言在map中
}
5、遍历
var e = make(map[string]int,8)
e["GO语言"] =100
e["GIN框架"] = 200
fmt.Println(e)
for value,key := range e{ //全部遍历
fmt.Println(value,key)
}
//输出:GO语言 100 GIN框架 200
for _,key1 := range e{ //只遍历key值
fmt.Println(key1)
}
//输出:100 200
for value2 := range e{ //只遍历value值
fmt.Println(value2)
}
//输出:GO语言 GIN框架
6、遍历后排序
//默认map类型是无序的,现在给一个map类型排序
//生成50个随机数组给这个map
var scoreMap = make(map[string]int,100)
for i :=0; i<50; i++ {
key1 := fmt.Sprintf("stu%02d", i)//%02d代表两位数开始,没自增一个数值就赋值给key
value1 := rand.Intn(100) //rand.intn函数作用就是随机生成数字给value
scoreMap[key1] = value1 //由上面两个key和value组成map类型
}
//1、生成一个切片,把所有map类型的key值存在到切片keys中
keys :=make([]string,0,100)
for k :=range scoreMap{
keys = append(keys,k)
}
//2、给切片keys排序
sort.Strings(keys)
fmt.Println(keys)
//3、把排序完的切片keys,遍历与map类型scoreMap中,并打印出对应于切片keys中的map类型scoreMap的value值
for _,key2 :=range keys{
fmt.Println(key2,scoreMap[key2])
}
//判断map类型是否存在此值,定义key3
value,ok := scoreMap["stu49"]
fmt.Println(value,ok)
if ok {
fmt.Println(value,scoreMap["stu49"])
}else {
fmt.Println("不存在")
}
输出结果:
[stu00 stu01 ... stu49]
stu00 81
stu01 87
stu02 47
stu03 59
stu04 81
.
.
.
stu49 53
53 true
53 53
7、删除map中的键值对
//删除键值对
var f = make(map[string]int,8)
f["GO语言"] = 100
f["GIN框架"] = 200
fmt.Println(f)
//输出:map[GIN框架:200 GO语言:100]
delete(f,"GIN框架")
fmt.Println(f)
//输出:map[GO语言:100]
am
package main
import "fmt"
func main() {
m := make(map[string]int)
m["a"] = 1
_, ok := m["a"]
fmt.Println(ok)
}
//输出true