go中基本数据类型,int,float,bool,string,以及数组和struct都是值类型,其特点为变量直接存储值,内存通常在栈中分配,栈在函数调用完会被释放。
指针,slice,map,chan等都是引用类型,其特点为变量存储的是一个地址,这个地址存储最终的值。内存通常在堆上分配,通过GC回收。
1.类似其他语言中的哈希表或者字典,以key-value形式存储数据;
2.key必须是支持==或!=比较运算的类型,不可以是函数、map或者slice(即必须是不可变类型);
3.map查找比线性搜索快很多,但比使用索引访问数据的类型慢100倍;
4.map使用make()创建,支持:=这种简写方式;
5.make([key type]value type cap),cap表示容量,可省略;
6.超出容量时会自动扩容,但尽量提供一个合理的初始值;
7.使用len()获取元素个数;
8.键值对不存在时自动添加,使用delete()删除某键值对;
9.使用for range对map和slice进行迭代操作。
10. map是引用类型数据
内存地址编号为0x0的空间,为系统占用空间,不允许进行读写操作。
判断值是否存在
m = map[int]string{}
m[1] = 'a'
m[2] = 'b'
# 判断值是否存在,存在则返回值和true;不存在则返回默认值(此处为'')和false
value,ok:=m[100]
import (
"fmt"
)
func main(){
// 定义map的三种方式
// 定义变量
var m map[int] string
// 初始化的两种方式
m = map[int]string{}
m = make(map[int]string)
fmt.Println(m,n)
var a map[int]string = make(map[int]string)
fmt.Println(a)
b := make(map[int]string)
fmt.Println(b)
}
2.1delete方法
赋值:map[key]=value
使用delete(map,key),如果key不存在,不会报错
func main1(){
b := make(map[int]string)
b['a'] = "OK"
a := b['a']
delete(b, 'a')
fmt.Println(b, a)
}
2.1.2嵌套map使用方法
嵌套map即map的value仍然为map,有多少层就要初始化多少次;
func main1(){
var m map[int]map[int]string
m = make(map[int]map[int]string)
// ok为布尔值,存在key为true,否则为false
a, ok := m['a']['a']
if !ok {
m['a'] = make(map[int]string)
}
m['a']['a'] = "OK"
fmt.Println(m, ok)
}
2.1.3迭代操作
切片迭代
func main2(){
sl:= [12] int{1,2,3,4,5}
slice := sl[:5]
for i,v:=range slice{
fmt.Println(i, v)
}
}
map迭代
func main2(){
slice:= make(map[int]string)
for k,v:=range slice{
fmt.Println(k, v)
}
}
切片中嵌套map(跟py中列表嵌套字典一样)
先用make创建切片,切片创建方式make([]type,len,cap),其中cap可以省略
func main2(){
sm := make([]map[int]string,5)
for i := range sm {
sm[i] = make(map[int]string, 1)
sm[i][1] = "OK"
fmt.Println(sm[i])
}
fmt.Println(sm)
}
利用切片对map中的key进行排序
func main2(){
m := map[int]string{1:"a", 2:"b", 3:"c",4:"d", 5:"e"}
s := make([]int, len(m))
i := 0
for key:=range m{
s[i] = key
i++)
}
sort.Ints(s)
fmt.Println(s)
}
键值对互换
func main2(){
m := map[int]string{1:"a", 2:"b", 3:"c",4:"d", 5:"e"}
l := map[string]int {}
for key,value:=range m{
l[value] = key
}
fmt.Println(l)
}
网友评论