1.slice 是对底层数组的一个视窗,slice[:2] 这个视窗除了len其余和原slice相同,也就是说 ptr和cap都相同
slice[2:]这个视窗,和原slice的ptr相同,len不同了,cap也不同了,比原来少了2个。
slice只有在超过cap的时候才扩容,产生一个新的切片。
2.map【map的key不可以是slice map fun类型,或者含有这些类型的结构体也不能作为map的key】,map的key必须是可以比较的
3.go的包,unsafe包,我认为unsafe.Align这个方法,返回的是变量的对齐模板,而sizeof返回的是变量的大小,这个大小是对齐以后的大小,不齐的用间隙补齐。之所以是不安全的,是因为在计算了数据大小之后,就可以偏移指针去操作不可见的数据。
数据对其:为什么要对齐,怎样对齐即对其规则,原因一是 平台原因,不是所有硬件平台都能访问任意地址的任意类型数据的,某些硬件平台智能在某些地址处取得某些特定类型数据 二是,cpu性能,cpu访问正确对齐的数据效率高。
对齐规则,地址值是k的整数倍,k是该类型数据的对齐模板,可以手动设置某一类型数据的对齐模板。
举例,struct结构体
eg
type stu struct{
id int//int类型是平台相关,64位os是8个字节,暂且把id占8字节
sex byte//1字节
nod rune//4字节
}
var lilei stu
//
//lilei内部占字节数是 8+1+4=13
//但是如果sizeof lilei的话,是16,Align lilei的话是8
//为啥呢:数据对齐,因为rune 4字节,访问的时候地址是4的整数倍,而sex 虽然只占1字节,但是不会马上就//在其后放 nod这个数据,需要加3个间隙,直到地址是4的整数倍,才放nod,所以 lilei是8+4+4=16字节;
//而lilei 的align数目是8,也就是lilei,这个变量在内存中,编译器会给lilei分配个8的倍数的地址。