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

深圳集团网站开发网站开发公司电话法制教育网站

深圳集团网站开发网站开发公司电话,法制教育网站,怎么爬虫做网站,北京关键词优化平台目录 切片的底层数据结构 扩容机制 总结#xff1a; 练习验证代码 这是切片的底层探索下篇#xff0c;上篇地址请见#xff1a;GO语言-切片底层探索#xff08;上#xff09; 在上篇我们讲解了切片的两个重要实现或者说是两个特征 切片是引用类型#xff0c;会进行…目录 切片的底层数据结构 扩容机制 总结 练习验证代码 这是切片的底层探索下篇上篇地址请见GO语言-切片底层探索上 在上篇我们讲解了切片的两个重要实现或者说是两个特征 切片是引用类型会进行引用传递切片会随着元素数量的增加进行扩容改变其底层数组的指向 这篇文章我们将会顺着讲解切片的底层数据结构和扩容机制 切片的底层数据结构 我们可以在src/runtime/slice.go下看到切片slice的底层数据结构 type slice struct {array unsafe.Pointerlen intcap int } 我们可以发现切片slice的基础定义很简单 指针类型的array指向底层数组int类型的len,存储切片的长度int类型的cap,存储切片的容量 由于在slice结构体中直接定义了len、cap字段因此我们平常使用len(slice)和cap(slice)其时间复杂度为O(1)不需要遍历整个切片。 扩容机制 Go语言切片的扩容机制由基本机制和调整机制组成 func growslice(oldPtr unsafe.Pointer, newLen, oldCap, num int, et *_type) slice {.....newcap : oldCapdoublecap : newcap newcapif newLen doublecap {newcap newLen} else {const threshold 256if oldCap threshold {newcap doublecap} else {// Check 0 newcap to detect overflow// and prevent an infinite loop.for 0 newcap newcap newLen {// Transition from growing 2x for small slices// to growing 1.25x for large slices. This formula// gives a smooth-ish transition between the two.newcap (newcap 3*threshold) / 4}// Set newcap to the requested cap when// the newcap calculation overflowed.if newcap 0 {newcap newLen}}}...... } 基本机制 如果新切片的长度大于旧切片的二倍容量就直接令新切片的容量等于新切片的长度如果旧切片的容量小于256,进行二倍扩容如果就切片的容量大于等于256按照newcapnewcap3*threshold/4公式进行扩容扩容速度减缓向1.25倍进行过渡。 在基本扩容规则的基础上还会考虑元素类型与内存分配规则对实际的扩张值做一些微调。从这一个基本规则中我们可以看出Go语言对slice性能和空间使用率的思考 当切片较小时采用较大的扩容倍速可以避免频繁地扩容从而减少内容分配次数和数据拷贝的代价。当切片较大时采用较小的扩容倍速主要是为了避免空间浪费。 因此使用append()向slice添加一个元素的实现步骤如下 假如slice容量够用则将新元素追加进去slice.len返回原slice原slice容量不够则将slice先扩容扩容后得到新slice将新元素追加进新sliceslice.len返回新的slice。 总结 切片是go语言中常用的容器由于其扩容特性容易发生一些不容易被发现的错误这就需要我们对切片的底层扩容机制有足够的了解知道什么时候切片会进行扩容操作和如果高效地使用切片进行数据的存储和处理。 练习验证代码 package mainimport fmttype student struct {name stringage intaddress string }func main() {//256以下的二倍扩容slice : make([]int, 255)fmt.Println(len(slice), cap(slice))newSlice : append(slice, 2)fmt.Println(len(newSlice), cap(newSlice)) }/*func main() {//结构体指针类型切片cap为1024的1.5倍扩容array : make([]*student, 1024)fmt.Println(len(array), cap(array))slice : arrayslice append(slice, student{name: wang, age: 12, address: 河南})fmt.Println(len(slice), cap(slice)) }*//*func main() {//结构体类型切片cap为1024的1.6倍扩容array : make([]student, 1024)fmt.Println(len(array), cap(array))slice : arrayslice append(slice, student{name: wang, age: 12, address: 河南})fmt.Println(len(slice), cap(slice)) }*///func main() { // //int类型的cap为1024的1.5倍扩容 // array : make([]int, 1024) // fmt.Println(len(array), cap(array)) // slice : array // slice append(slice, 1) // fmt.Println(len(slice), cap(slice)) //}
http://www.hkea.cn/news/14345926/

相关文章:

  • flash企业网站哪个网站建站好500平台
  • wordpress 如何购买主题优化网络推广外包
  • 电子产品网站建设策划书泉州百度开户
  • 网站建设机器人网站在公司做有什么要求吗
  • 网站建设的具体方法我想做地推怎么找渠道
  • 付给招聘网站的费用怎么做分录柏乡县建设局网站
  • 网站查询地址成都网站快速开发
  • 太原网站运营优化营销网站设计实验
  • 农业网站建设方案 ppt搜索推广渠道
  • 青岛网站建设系统广州新塘网页设计培训
  • 阿里云网站建站成都网站设计定制
  • 建设seo网站wordpress社交风格模板
  • 音乐网站 模板我是seo关键词
  • 男性产品哪个网站可以做重庆建企业网站
  • 青岛如何做网站seo做网站哪里找程序员
  • 东莞装饰网站建设网站开发如何无感更新
  • 广东建设部网站怎么做才能提高网站权重
  • 达孜网站建设永康城乡建设局网站
  • 用c 做网站在Linux上老薛主机wordpress设置
  • 空间坐标系做图网站网站收录没图片
  • 公司网站icp备案举例说明
  • 备案编号不放在网站wordpress 开发列表网
  • 怎么做wep网站快速搭建网站的好处
  • 哪里可以做网站推广做推广的注册什么公司好
  • 怎样用ps做网站首页图片营销策划的步骤
  • 天津网站优化公司电话备案 网站错了
  • 小学校园文化建设网站赛车pk10计划网站建设
  • 刚注册公司怎么做网站北京网站建设好不好天
  • 网站提交万网网站到期后续费一年多少钱
  • 做公众号链接的网站品牌网站设计打造