map介绍
map 是key-value 数据结构,也叫字段或者关联数组,类似python中的字典。
map的基本语法:
定义map的两种方式:
var map_variable map[keyType]valueType
map_variable := make(map[keyType]valueType)
key 的类型,可以是bool、数字、string、指针、channel;一般是int、string
value的类型,基本与key的类似,但是有时候会出现(字典)嵌套,此时key会使用map、struct类型。
map声明举例
map声明举例,声明不会分配内存,初始化需要使用make进行,分配内存后才能赋值使用。
var ex map[string]int {"test":1}
var ey map[string]string {"test":"test"}
var ez map[int]string {1:"test",2:"test2"}
var ev map[string]map[string]string {"test":{"map":"deepin"}}
声明后不能直接使用
func main() {
var ex map[string]int
ex["data"]=1 //此时会直接报错,
fmt.Prinrln(ex)
}
必须make进行分配内存
func main() {
var ex map[string]int
// 使用前需要先make进行分配内存,然后再使用
ex = make(map[string]int) //make (type,size int) Type make时可以指定容量,类型。可以通过len,cap进行查看长度、容量
ex["data"]=1 //没问题
ex["data"]=2 // key相同会直接进行覆盖
ex["data2"]=1 // key不同,值相同没毛病
fmt.Prinrln(ex)
}
// key是不可以重复的,value是可以重复的
map的一般使用
//方式一 先声明再分配空间
var eg map[string]string
eg = make(map[string]string)
eg["data"] = "test"
//方式二 make 声明+分配空间 使用最多的方式
var eg = make(map[string]string)
eg["data"]="test"
//方式三 声明直接赋值
var eg map[string]string = map[string]string{"data":"test"}
下面这种和上面一样
eg := map[string]string{
"data":"test",
"data2":"test2", //此处时的逗号一定要有
}
基础使用之嵌套map(python中的字典)
// 定义2个人,并且这2个人具有性别、年龄
func main(){
var person map[string]map[string]string
person["bill"] = make(map[string]string)
person["bill"]["age"] = "12" //定义的是string类型,所以12必须用引号
person["bill"]["sex"] = "boy"
person["tom"] = make(map[string]string)
person["tom"]["age"] = "16"
person["tom"]["sex"] = "girl"
//查询、取出操作
fmt.Println(person["tom"]) //打印tom所有信息
fmt.Println(person["tom"]["age"]) //打印tom年龄
}
map的增删改查(crud)
//其中增、改 方式是一样的,对于key有则改、无则增
var person = make(map[string]string)
person["pOne"] = "Tom" // 增
person["pTow"] = "Bill" // 增
person["pOne"] = "Gerr" //改
删:
delete(map,"key"),如果key存在在删除此数据;如果不存在,delete不进行操作,也不会报错
// 删除person中的pTow的数据
delete(person, "pTow")
// 需要注意,map的删除中,如果想要删除所有的key,可以遍历,然后进行删除。或者直接将变量make一个新的,让原来的成为垃圾,被gc回收
var person = make(map[string]string) //这样会重新分配一块内存,类似清空所有key
// map查找
val, isExist := person["Pone"]
// 如果person中存在Pone这个key,则返回为val为value,isExist为True,不存在则val=nil,isExist=false
删除时需要注意
channel 类型介绍
channel类可以看成一个管道。通过它并发核心单元就可以发送或者接收数据进行通讯,
操作符是箭头 <- (箭头的指向就是数据的流向)
ch := make(chan int) // channel 类型也必须要先创建然后再使用 make(chan int, 100)
ch <- v // 发送值v到Channel ch中
v := <-ch // 从Channel ch中接收数据,并将数据赋值给v
func main() {
go func() {
time.Sleep(1 * time.Hour)
}()
c := make(chan int)
go func() {
for i := 0; i < 10; i = i + 1 {
c <- i
}
close(c)
}()
for i := range c {
fmt.Println(i)
}
fmt.Println("Finished")
}
range c产生的迭代值为Channel中发送的值,它会一直迭代直到channel被关闭。
上面的例子中如果把close(c)注释掉,程序会一直阻塞在for …… range那一行。