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

绍兴大明电力建设有限公司网站国外设计灵感网站

绍兴大明电力建设有限公司网站,国外设计灵感网站,没网站怎么做app,徐州网站设计网切片长度与容量在 Go 中很常见。切片长度是切片中可用元素的数量#xff0c;而切片容量是从切片中第一个元素开始计算的底层数组中的元素数量。 Go 中的开发者经常混淆切片长度和容量#xff0c;或者对它们不够了解。理解这两个概念对于高效处理切片的核心操作#xff0c;比… 切片长度与容量在 Go 中很常见。切片长度是切片中可用元素的数量而切片容量是从切片中第一个元素开始计算的底层数组中的元素数量。 Go 中的开发者经常混淆切片长度和容量或者对它们不够了解。理解这两个概念对于高效处理切片的核心操作比如切片的初始化、使用 append 添加元素、复制或切片操作等至关重要。对这些概念的误解可能导致切片的不合理使用甚至造成内存泄漏。 在 Go 中切片是由数组支持的。这意味着切片的数据以连续的方式存储在数组数据结构中。切片还负责在底层数组已满时添加元素或在几乎为空时缩减底层数组。 在内部切片包含指向底层数组的指针以及长度和容量。长度表示切片包含的元素数量而容量表示底层数组中的元素数量从切片中的第一个元素开始计算。让我们通过一些示例来更清楚地了解这些概念。首先让我们使用给定的长度和容量初始化一个切片 s : make([]int, 3, 6) // Three-length, six-capacity slice第一个参数表示长度是必须的。但是第二个参数表示容量是可选的。图1展示了此代码在内存中的结果。 Figure 1 — 一个长度为3、容量为6的切片 在这种情况下make 创建了一个包含六个元素的数组容量。但由于长度设置为3Go 只初始化了前三个元素。另外因为切片是 []int 类型所以前三个元素被初始化为 int 类型的零值0。灰色元素已经分配但尚未使用。 如果我们打印这个切片会得到长度范围内的元素 [0 0 0]。如果我们将 s[1] 设为1切片的第二个元素会更新但不会影响其长度或容量。图2说明了这一点。 图2 — 更新切片的第二个元素s[1] 1 然而访问超出长度范围之外的元素是被禁止的即使它在内存中已经分配。例如s[4] 0 会导致以下 panic panic: runtime error: index out of range [4] with length 3我们如何使用切片剩余的空间呢通过使用内置函数 append s append(s, 2)这段代码向现有的 s 切片追加了一个新元素。它使用了第一个灰色元素已分配但尚未使用来存储元素2正如图3所示。 图3 — 向 s 切片追加一个元素 切片的长度从3更新为4因为现在切片包含了四个元素。现在如果我们再添加三个元素以至于后台数组不够大会发生什么 s append(s, 3, 4, 5) fmt.Println(s)如果我们运行这段代码会看到切片能够满足我们的请求 [0 1 0 2 3 4 5]因为数组是一个固定大小的结构在第4个元素之前它能够存储新的元素。当我们想要插入第5个元素时数组已经满了Go 内部会创建另一个数组将所有元素复制过去然后再插入第5个元素。图4展示了这个过程。 图4 — 因为初始的后台数组已满Go 创建了另一个数组并复制了所有元素。 现在切片引用了新的后台数组。之前的后台数组会怎样呢如果它不再被引用它最终会被垃圾收集器GC释放如果它是在堆上分配的话我们在错误95 “不理解堆栈与堆的区别”中讨论了堆内存并在错误99 “不理解GC的工作原理”中讨论了GC的工作原理。 对切片进行切片操作会发生什么切片是对数组或切片进行的操作提供了一个左闭右开的范围第一个索引是包括的而第二个索引是排除的。以下示例展示了影响并在图5中显示了内存中的结果 s1 : make([]int, 3, 6) // Three-length, six-capacity slice s2 : s1[1:3] // Slicing from indices 1 to 3图5 — 切片 s1 和 s2 引用相同的后台数组但长度和容量不同 首先s1 是一个长度为3、容量为6的切片。当通过对 s1 进行切片创建 s2 时两个切片都引用同一个后台数组。但是s2 从不同的索引开始即索引1。因此它的长度和容量长度为2容量为5与 s1 不同。如果我们更新 s1[1] 或 s2[0]则更改会作用于同一个数组因此在两个切片中都是可见的如图6所示。 图6 — 因为 s1 和 s2 共享同一个数组更新共同的元素会使两个切片中的更改都可见 现在如果我们向 s2 添加一个元素会发生什么以下代码会同时改变 s1 吗 s2 append(s2, 2)共享的后台数组被修改但只有 s2 的长度发生了变化。图7展示了向 s2 添加元素的结果。 图7 — 向 s2 添加元素 s1 仍然是一个长度为3、容量为6的切片。因此如果我们打印 s1 和 s2添加的元素只会在 s2 中可见 s1[0 1 0], s2[1 0 2]很重要理解这种行为这样我们在使用 append 时就不会形成错误的假设。 注意: 在这些示例中后台数组是内部的不直接对 Go 开发者可见。唯一的例外是从现有数组切片创建切片。 还有最后一件事需要注意如果我们不断向 s2 中添加元素直到后台数组满为止内存状态会是怎样的让我们再添加三个元素以便后台数组没有足够的容量 s2 append(s2, 3) s2 append(s2, 4) // At this stage, the backing is already full s2 append(s2, 5)这段代码导致创建了另一个后台数组。图 8 展示了内存中的结果。 图 8 — 向 s2 添加元素直到后台数组已满 s1 和 s2 现在引用两个不同的数组。由于 s1 仍然是一个三长度、六容量的切片它仍然有一些可用缓冲区因此它继续引用最初的数组。而且新的后台数组是通过从 s2 的第一个索引复制初始数组而生成的。这就是为什么新数组从元素 1 开始而不是 0。 结论 总结一下切片长度 是切片中可用元素的数量而 切片容量 是后台数组中的元素数量。向一个已满的切片长度 容量添加元素会导致创建一个新的后台数组将之前数组中的所有元素复制到新数组中并更新切片指向新数组。
http://www.hkea.cn/news/14323189/

相关文章:

  • 用excel做网站网络营销编辑干什么的
  • 怎么用服务器搭建网站成都规划网站
  • 厦门市建设工程安全管理协会网站做网站公司哪家
  • 郑州七七网站建设西安网站建设运维
  • 温州联科网站建设wordpress建站解析
  • 公司的网站建设费用属于什么费网站建设怎么问问题
  • 汽车电子商务网站建设规划书二级域名和一级域名优化难度
  • 苏州网站开发公司招聘信息ui是什么工作
  • 全是广告的网站单页面推广网站模版
  • 张家界住房和城乡建设局网站网站未备案wordpress
  • 国家机构网站建设工商局网站做年报
  • 长春网站制作一般需要多少钱做网站很挣多少钱
  • 哪里有免费的网站模板下载那些网站使用vue做的
  • 东莞网站平台后缀长沙百度
  • 德阳网站设计他达拉非功效与作用主要会有哪些
  • 建站之星多语言个人网站用什么建站程序
  • wordpress百度云网盘seo课程培训班
  • 企业网站策划方案模板在线编辑网页
  • 网站免费建站广告机公司网站域名 优帮云
  • 东海建设局网站上海建设工程造价信息网
  • flash 网站设计买了winhost网站空间在哪里登陆
  • 网站seoapp贵州省建设厅审图网站
  • 网站建设办公纺织品公司网站建设
  • 专业网站建设机构网站的免费空间是什么
  • 网站开发项目税率品牌网站制作公司
  • 给网站做网络安全的报价东莞食品网站建设
  • 深圳网站维护服务的公司广东广州安全教育平台
  • 专门做恐怖电影网站广告设计公司制作
  • 怎样建设门户网站手机wap网页
  • 自己做的网站如何让别人看到网站 前置审批