map里key的value值是可以放slice的,反之slice的index也是可以存放map的。
package main
import(
"fmt"
)
func sliceMap() {
/**
var s []map[string]int
s = make([]map[string]int,5,16)
*/
x := make([]map[string]int,5,16)
for index,value := range x {
fmt.Printf("index = %d,value = %v\n",index,value)
}
x[0] = make(map[string]int,10)
x[0]["jack"] = 10
}
上面代码做了哪些事:
第9行:声明了一个空切片类型为map的变量s
第10行:使用make初始化切片,否则无法操作切片
第13行:使用了简写声明的方式初始化切片
第15行:使用for range对x进行遍历,这里要注意的是index指的是切片下标,与map的key值不同,这里要区分一下
第16行:打印下标与下标值,因为初始化的切片长度是5个,所以每个下标的值都是一个map,打印时要使用%v格式化
第19行:因为每个下标的值都是map,但是这些map都没有进行过初始化,所以要使用make进行初始化一次才能进行赋值
第21行:为切片x第一个下标的map中第一个key:jack进行赋值
打印结果:index = 0,val = map[jack:10]
index = 1,val = map[]
index = 2,val = map[]
index = 3,val = map[]
index = 4,val = map[]
切片与map的关系可以看作是以下图:
map里放入slice
package main
import(
"fmt"
)
fun mapSlice() {
/**
声明方式:
var s map[string][]int
s = make(map[string][]int)
*/
s := make(map[string][]int)
key := "id0"
val,ok := s[key]
if !ok {
s[key] = make([]int,0,16)
val = s[key]
}
val = append(val,100)
val = append(val,200)
s[key] = val
}
上面代码作用:
第15行:初始化一个key为string,value为空切片的map
第17行:初始化一个string值类型变量key
第19行:常用map值交换操作,s[key]代表的当前的key+value,key会给ok,value会给val
第21行:取反操作,如果变量key的值存不存在于map中,那么对map下面的key的value进行切片初始化(map中所有的value都是切片类型,所以要进行初始化)
第22行:对map中的value进行切片初始化
第23行:将初始化的切片给val,打印结果为:val = []
,由此可知,val取得到的value
第26行:对val[0]进行追加数据操作,此时还能放入15个元素
第27行:对val[1]进行追加数据操作,此时还能放入14个元素
第29行:将追加好的val切片赋值给s[key]
s[key]打印结果:s[key] = [100 200]
s打印结果:s = map[id0:[100 200]]