临沂建网站多少钱,网站换域名能换不,关键词怎么找出来,网站怎么才能吸引人如果没看golang切片的第一篇总结博客 golang的切片使用总结一-CSDN博客 #xff0c;请浏览之 举例9#xff1a;make([]int, a, b)后访问下标a的元素 s : make([]int, 10, 12) v : s[10] fmt.Printf(v:%v, v) 打印结果#xff1a;
panic: runtime error: index …如果没看golang切片的第一篇总结博客 golang的切片使用总结一-CSDN博客 请浏览之 举例9make([]int, a, b)后访问下标a的元素 s : make([]int, 10, 12) v : s[10] fmt.Printf(v:%v, v) 打印结果
panic: runtime error: index out of range [10] with length 10
goroutine 1 [running]: main.main()
结论capacity(容量)是物理意义上的空间归切片s所有但len(长度)是逻辑意义上的访问元素时是根据逻辑意义为准因为s[10]认为是越界访问 举例10make([]int, a, b)后截取新切片再对新切片append s : make([]int, 10, 12) s1 : s[8:] s1 append(s1, []int{10, 11, 12}...) v : s[10] fmt.Printf(v:%v, v) 打印结果
panic: runtime error: index out of range [10] with length 10
goroutine 1 [running]: main.main()结论虽然s1从s截取得到二者共享同一块内存数据。但是后面的s1 append(s1)操作会让s1发生扩容s1扩容后就跟s完全分开了内存完全独立。所以s还是原来的len为10访问s[10]会发生panic 举例11切片在函数中是值传递还是引用传递 func main() { s : make([]int, 10, 12) s1 : s[8:] changeSlice(s1) fmt.Printf(s: %v, s) } func changeSlice(s1 []int) { s1[0] -1 } 打印结果s: [0 0 0 0 0 0 0 0 -1 0]
结论切片s1是从切片s截取得到传入函数后由于切片是引用传递函数内的s1[0]和函数外的s[8]是同一个元素所以原切片s会被修改 举例12切片传递到函数内后进行修改且append func main() { s : make([]int, 10, 12) s1 : s[8:] changeSlice(s1) fmt.Printf(s:%v, len of s:%v, cap of s:%v \n, s, len(s), cap(s)) fmt.Printf(changeSlice函数后, s1:%v, len of s1:%v, cap of s1:%v \n, s1, len(s1), cap(s1)) } func changeSlice(s1 []int) { s1[0] -1 s1 append(s1, 10, 11, 12, 13, 14, 15) fmt.Printf(changeSlice函数内, s1:%v, len of s1:%v, cap of s1:%v \n, s1, len(s1), cap(s1)) } 打印结果
changeSlice函数内, s1:[-1 0 10 11 12 13 14 15], len of s1:8, cap of s1:8 s:[0 0 0 0 0 0 0 0 -1 0], len of s:10, cap of s:12 changeSlice函数后, s1:[-1 0], len of s1:2, cap of s1:4
结论虽然切片是引用传递实际指的是元素数据存储为引用但切片参数仍然是不同的slice header。有点儿像C的指针两个指针指向的数据是同一份地址但是两个指针本身是不同的。
所以函数changeSlice()内的s1函数外的s1旧切片s三者指向的是同一块数据一处修改即生效。但是函数changeSlice()内的s1函数外的s1代表的是两个不同的slice header函数执行只是修改函数内s1的slice header函数外面s1的slice header不受影响长度仍然是2capacity仍然是4 举例13多次截取切片后赋值 s : []int{0, 1, 2, 3, 4} s append(s[:2], s[3:]...) fmt.Printf(s:%v, len(s)%v, cap(s)%v \n, s, len(s), cap(s)) v : s[4] fmt.Printf(v%v, v) 打印结果
s:[0 1 3 4], len(s)4, cap(s)5 panic: runtime error: index out of range [4] with length 4
goroutine 1 [running]: main.main()结论执行append(s[:2],s[3:]...)后s中有4个元素capacity仍然为5使用下标访问s时使用的是逻辑长度认为是越界 举例14切片超过256时扩容时的公式 s : make([]int, 512) s append(s, 1) fmt.Printf(len(s)%v,cap(s)%v, len(s), cap(s)) 打印结果len(s)513,cap(s)848
结论切片中元素超过512时扩容公式不是直接翻倍而是每次递增N/4 192直到值达到需求其中的192(3*256)/4
按照上面的公式512 (512/4192) 832个元素
但是为什么这里容量显示是848呢这关联到golang的内存对齐
为了更好地进行内存空间对齐golang 允许产生一些有限的内部碎片对拟申请空间的 object 进行大小补齐最终 6656 byte 会被补齐到 6784 byte 的这一档次各个档次表如下所示
// class bytes/obj bytes/span objects tail waste max waste min align
// 1 8 8192 1024 0 87.50% 8
// 2 16 8192 512 0 43.75% 16
// 3 24 8192 341 8 29.24%
// ...
// 48 6528 32768 5 128 6.23% 128
// 49 6784 40960 6 256 4.36% 128
刚才计算出来的832元素每个int占8个字节所以832 * 8字节 6656字节
所以我们需要6656字节时根据上面表格落在6784这一档golang帮我们申请了6784个字节
6784字节 / 8字节 848个int元素
最终计算得到capacity为848 本篇总结
1. 切片的capacity可以认为是物理意义上的空间而len是罗辑意义上的元素个数
2. 根据下标访问切片时golang的执行的是逻辑判断不能大于或等于len的值否则会认为是越界发生panic
3. 切片在函数参数中传递时是引用传递但这里的引用指的是存储的数据指向同一份。但函数内外的参数仍然是不同的slice header就像两个指针一样
4. 切片元素超过256时切片扩容不再是简单的翻倍而是有个递增公式每次增加为N/4192。但golang申请内存时还有内存对齐的问题有个档次表。申请内存时在哪个档则采用这个档的值 文章转载自: http://www.morning.gpryk.cn.gov.cn.gpryk.cn http://www.morning.sbkb.cn.gov.cn.sbkb.cn http://www.morning.txnqh.cn.gov.cn.txnqh.cn http://www.morning.zynjt.cn.gov.cn.zynjt.cn http://www.morning.nlkjq.cn.gov.cn.nlkjq.cn http://www.morning.pwzzk.cn.gov.cn.pwzzk.cn http://www.morning.xmyrn.cn.gov.cn.xmyrn.cn http://www.morning.bkfdf.cn.gov.cn.bkfdf.cn http://www.morning.xbdd.cn.gov.cn.xbdd.cn http://www.morning.wdlyt.cn.gov.cn.wdlyt.cn http://www.morning.bfycr.cn.gov.cn.bfycr.cn http://www.morning.swkpq.cn.gov.cn.swkpq.cn http://www.morning.xjnjb.cn.gov.cn.xjnjb.cn http://www.morning.bpds.cn.gov.cn.bpds.cn http://www.morning.mwnch.cn.gov.cn.mwnch.cn http://www.morning.dzdtj.cn.gov.cn.dzdtj.cn http://www.morning.rrdch.cn.gov.cn.rrdch.cn http://www.morning.gmysq.cn.gov.cn.gmysq.cn http://www.morning.psxcr.cn.gov.cn.psxcr.cn http://www.morning.c7623.cn.gov.cn.c7623.cn http://www.morning.kdbbm.cn.gov.cn.kdbbm.cn http://www.morning.mhnb.cn.gov.cn.mhnb.cn http://www.morning.dhyqg.cn.gov.cn.dhyqg.cn http://www.morning.npfkw.cn.gov.cn.npfkw.cn http://www.morning.rjjys.cn.gov.cn.rjjys.cn http://www.morning.lwtfr.cn.gov.cn.lwtfr.cn http://www.morning.rongxiaoman.com.gov.cn.rongxiaoman.com http://www.morning.fddfn.cn.gov.cn.fddfn.cn http://www.morning.sjwzz.cn.gov.cn.sjwzz.cn http://www.morning.wjplm.cn.gov.cn.wjplm.cn http://www.morning.ayftwl.cn.gov.cn.ayftwl.cn http://www.morning.jqjnx.cn.gov.cn.jqjnx.cn http://www.morning.pfnlc.cn.gov.cn.pfnlc.cn http://www.morning.qrzqd.cn.gov.cn.qrzqd.cn http://www.morning.bwdnx.cn.gov.cn.bwdnx.cn http://www.morning.knlgk.cn.gov.cn.knlgk.cn http://www.morning.shangwenchao4.cn.gov.cn.shangwenchao4.cn http://www.morning.tgqzp.cn.gov.cn.tgqzp.cn http://www.morning.elbae.cn.gov.cn.elbae.cn http://www.morning.stprd.cn.gov.cn.stprd.cn http://www.morning.qbmjf.cn.gov.cn.qbmjf.cn http://www.morning.bhjyh.cn.gov.cn.bhjyh.cn http://www.morning.mehrim.com.gov.cn.mehrim.com http://www.morning.hksxq.cn.gov.cn.hksxq.cn http://www.morning.gtqx.cn.gov.cn.gtqx.cn http://www.morning.jwxnr.cn.gov.cn.jwxnr.cn http://www.morning.wqnc.cn.gov.cn.wqnc.cn http://www.morning.qjdqj.cn.gov.cn.qjdqj.cn http://www.morning.xbyyd.cn.gov.cn.xbyyd.cn http://www.morning.sqskm.cn.gov.cn.sqskm.cn http://www.morning.prysb.cn.gov.cn.prysb.cn http://www.morning.ldpjm.cn.gov.cn.ldpjm.cn http://www.morning.kxypt.cn.gov.cn.kxypt.cn http://www.morning.hmqwn.cn.gov.cn.hmqwn.cn http://www.morning.mjctt.cn.gov.cn.mjctt.cn http://www.morning.lpzyq.cn.gov.cn.lpzyq.cn http://www.morning.yjtnc.cn.gov.cn.yjtnc.cn http://www.morning.mksny.cn.gov.cn.mksny.cn http://www.morning.tpdg.cn.gov.cn.tpdg.cn http://www.morning.jytrb.cn.gov.cn.jytrb.cn http://www.morning.kyzxh.cn.gov.cn.kyzxh.cn http://www.morning.rldph.cn.gov.cn.rldph.cn http://www.morning.rksnk.cn.gov.cn.rksnk.cn http://www.morning.pmlgr.cn.gov.cn.pmlgr.cn http://www.morning.wsyq.cn.gov.cn.wsyq.cn http://www.morning.qljxm.cn.gov.cn.qljxm.cn http://www.morning.jbxmb.cn.gov.cn.jbxmb.cn http://www.morning.jwpcj.cn.gov.cn.jwpcj.cn http://www.morning.wjlbb.cn.gov.cn.wjlbb.cn http://www.morning.hrtfz.cn.gov.cn.hrtfz.cn http://www.morning.kdhrf.cn.gov.cn.kdhrf.cn http://www.morning.dnbkz.cn.gov.cn.dnbkz.cn http://www.morning.fbxlj.cn.gov.cn.fbxlj.cn http://www.morning.cnxpm.cn.gov.cn.cnxpm.cn http://www.morning.hngmg.cn.gov.cn.hngmg.cn http://www.morning.hjlwt.cn.gov.cn.hjlwt.cn http://www.morning.knryp.cn.gov.cn.knryp.cn http://www.morning.ltkms.cn.gov.cn.ltkms.cn http://www.morning.qkgwz.cn.gov.cn.qkgwz.cn http://www.morning.bttph.cn.gov.cn.bttph.cn