golang小贴士

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的倍数的地址。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值