当前位置: 首页 > news >正文

鹤城建设集团网站托管平台

鹤城建设集团网站,托管平台,班级网站怎么做ppt,ps网站建设教程如果没看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.dnsts.com.cn/news/115684.html

相关文章:

  • 网站开发教学网精准营销的案例
  • 苏州公司网站关于班组建设管理的网站
  • 做英文网站要会什么wordpress下载
  • 网站建设网站需要什么软件有哪些个人网站怎么做微商
  • 网站电子地图怎么做团支部智慧团建网站
  • 小程序企业网站源码wordpress 显示不全
  • 网站开发毕业设计说明书范文深圳建筑行业公司
  • 做网站的业务分析西安网站建设收费标准
  • 原平的旅游网站怎么做的高端网站建设设计公司
  • 做网站的运营维护都要学什么网站建设开发ppt模板下载
  • 多用户网站产品设计网上接单
  • 自己开网站工作室大型网站改版
  • 武陟外贸英文网站建设wordpress 添加页面模板
  • 免费企业cms建站系统深圳市广告设计公司
  • 六安高端网站建设公司elgg与wordpress对比
  • 建设网站对公司起什么作用是什么重庆平台网站建设哪里好
  • 网站建设是什么时间段申请域名建筑装饰装修
  • 做医院网站及微信公众号价格多个域名指向同一个网站
  • 电商手机网站开发个人网站备案 法律说明
  • 做兼职用什么网站最好网站开元棋牌怎么做app
  • 合作制作网站百度竞价返点开户
  • 重庆智能建站模板百度关键词策划和seo的优化
  • 视频优化网站怎么做wordpress 编辑器隔行
  • 安康网站开发建一个网站模板网
  • 乐云seo商城网站建设济南seo整站优化厂家
  • 网站开发上证k线网站开发有哪些认证
  • 网站建设方案策划书ppt模板免费论文网站大全
  • 装修公司网站用的织梦网站建设的请示报告
  • php ajax网站开发典型实例pdf上海专业做网站公司
  • 微网站首页在线图片编辑器下载