”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 切片:GO的骨干!

切片:GO的骨干!

发布于2025-03-23
浏览:110

Slices: The Backbone of Go!好吧,让我们深入研究GO最通用和最重要的功能之一 - 切片。如果您来自另一种语言,您可能会认为切片类似于数组。而且,是的,它们确实有一些相似之处,但是切片为桌子带来了更多的力量,灵活性和特定的魔术! ?

无论如何是什么切片? ?

因此,GO中的切片实际上是基础数组上的“窗口”。您可以通过种植或收缩来更改此窗口的大小 - 它与切小菜单一样光滑。 ?

创建一个slice?

创建切片非常简单:


//使用文字 数字:= [] int {1,2,2,3,4,5} //使用制造功能 sliceofstrings:= make([] string,5)//一个5个字符串,每个串

初始化为一个空字符串
// Using a literal
numbers := []int{1, 2, 3, 4, 5}

// Using the make function
sliceOfStrings := make([]string, 5) // a slice of 5 strings, each 

长度和容量?

切片中的两个关键概念是长度和容量。长度是当前在切片中的元素数量,而容量是它可以调整大小之前可以保留的元素总数。

数字:= [] int {1,2,3} fmt.println(len(numbers))// 3 fmt.println(CAP(数字))// 3(在这里与长度相同)


开始附加物品时,只要填充容量就会增加一倍,因此您不必担心碰到天花板。

numbers := []int{1, 2, 3}
fmt.Println(len(numbers)) // 3
fmt.Println(cap(numbers)) // 3 (same as length here)
图案

附加切片:GO的内置魔术?✨
将元素添加到切片中就像GO的附加功能一样容易。您可以一次添加一个或多个元素,并且GO将为您处理所有调整大小和内存的内容。

numbers = append(numbers, 4)
fmt.Println(len(numbers)) // 4
fmt.Println(cap(numbers)) // probably 6 now, depending on Go’s growth 

此自动重构功能使切片非常方便,尤其是如果您不知道列表会得到多大。
切片切片?

numbers := []int{1, 2, 3}
numbers = append(numbers, 4, 5, 6) // Adding multiple elements at once
fmt.Println(numbers) // [1 2 3 4 5 6]
[1:4]中的

是包容性的,最后一个索引(4)是独有的。您最终以位于位置1、2和3的位置的元素,但不是4。

此子片仍然与原始切片共享相同的基础数组,因此更改将影响另一个片:

subslice [0] = 25 fmt.println(数字)// [10 25 30 40 50] fmt.println(subslice)// [25 30 40]

避免任何意外的更改,您可以使用复制来创建slice的独立版本:
numbers := []int{10, 20, 30, 40, 50}
subSlice := numbers[1:4] // Just takes a "slice" of the original slice
fmt.Println(subSlice) // [20 30 40]
[2 复制(新闻社,子列)

附加的容量变化?


如果您需要一个大于当前容量的切片,则附录将在后台自动创建一个新的,更大的数组并复制所有内容。这是令人难以置信的高效,并且是使切片令人敬畏的很大一部分。当附加创建一个新数组时,它将分配给先前的容量两倍 - 给您增长的空间!

切片和记忆效率?
subSlice[0] = 25
fmt.Println(numbers) // [10 25 30 40 50]
fmt.Println(subSlice) // [25 30 40]
这是一个小小的秘密:虽然切片超级强大,但如果您不小心,有时会导致内存泄漏。由于切片是指相同的基础数组,因此即使您只使用其中的一小部分,数组也可能保留在内存中。

例如:

newSlice := make([]int, len(subSlice))
copy(newSlice, subSlice)

在这种情况下,最好使用复制来创建一个真正独立的切片,该切片仅包含您需要的数据,释放其余内存。

[2 复制(minislice,smallslice)//现在完全分开!

多维切片?

需要一个以上的维度?您也可以创建多维切片!这对于网格或桌子之类的东西可能很方便。只需声明一片切片:

[2 {1,2,3}, {4,5,6}, {7,8,9}, } fmt.println(矩阵)// [[1 2 3] [4 5 6] [7 8 9]]


每个“行”本身就是一个切片,因此您可以在需要时独立种植它们。

[2 fmt.println(矩阵)// [[1 2 3 10] [4 5 6] [7 8 9]]
numbers := []int{1, 2, 3}
fmt.Println(len(numbers)) // 3
fmt.Println(cap(numbers)) // 3 (same as length here)
零切片?


nil slice只是尚未初始化的切片。它的长度和容量为零,但仍然可以与无恐慌之类的功能进行使用。

miniSlice := make([]int, len(smallSlice))
copy(miniSlice, smallSlice) // Now `miniSlice` is completely separate!

附加到零切片时,请自动为您初始化它。袖子是一个整洁的技巧。

陷阱和最佳实践?

注意共享内存:请记住,切片与原始数组共享内存。这非常适合性能,但是在切片大数组的一部分时要谨慎,以免将不需要的数据保存在内存中。
提防调整大小:当您附加时,如果当前容量已满,则可能需要创建一个新的基础数组。这比完成许多小型尺寸可能更有效,但是如果您要处理大型数据集,请注意开销。

避免过早优化:进行大量内存分配,并使用切片自动调整大小。通常,尝试对这些细节进行微观管理可能会使您的代码变得更加混乱,效率降低。在大多数情况下,信任GO的切片机制可以做正确的事情。
matrix := [][]int{
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9},
}
fmt.Println(matrix) // [[1 2 3] [4 5 6] [7 8 9]]

版本声明 本文转载于:https://dev.to/learngo/slices-the-backbone-of-go-21ig?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php PHP陷入困境。使用simplexmlelement :: attributes()函数提供了简单的解决方案。此函数可访问对XML元素作为关联数组的属性: - > attributes()为$ attributeName => $ attributeValue){ echo ...
    编程 发布于2025-04-17
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-04-17
  • 为什么我的CSS背景图像出现?
    为什么我的CSS背景图像出现?
    故障排除:CSS背景图像未出现 ,您的背景图像尽管遵循教程说明,但您的背景图像仍未加载。图像和样式表位于相同的目录中,但背景仍然是空白的白色帆布。而不是不弃用的,您已经使用了CSS样式: bockent {背景:封闭图像文件名:背景图:url(nickcage.jpg); 如果您的html,css...
    编程 发布于2025-04-17
  • 哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    在Python Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a path object to represent the polygon.它...
    编程 发布于2025-04-17
  • 为什么HTML无法打印页码及解决方案
    为什么HTML无法打印页码及解决方案
    无法在html页面上打印页码? @page规则在@Media内部和外部都无济于事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: bo...
    编程 发布于2025-04-17
  • Java的Map.Entry和SimpleEntry如何简化键值对管理?
    Java的Map.Entry和SimpleEntry如何简化键值对管理?
    A Comprehensive Collection for Value Pairs: Introducing Java's Map.Entry and SimpleEntryIn Java, when defining a collection where each element com...
    编程 发布于2025-04-17
  • C++20 Consteval函数中模板参数能否依赖于函数参数?
    C++20 Consteval函数中模板参数能否依赖于函数参数?
    [ consteval函数和模板参数依赖于函数参数在C 17中,模板参数不能依赖一个函数参数,因为编译器仍然需要对非contexexpr futcoriations contim at contexpr function进行评估。 compile time。 C 20引入恒定函数,必须在编译时进行...
    编程 发布于2025-04-17
  • Java命令行参数解析方法及技巧
    Java命令行参数解析方法及技巧
    在java For a robust and feature-rich solution, consider using the following libraries:Apache Commons CLI: http://commons.apache.org/cli/JSAP: http://w...
    编程 发布于2025-04-17
  • CSS强类型语言解析
    CSS强类型语言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    编程 发布于2025-04-17
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-04-17
  • 如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    Unveiling the Mystery: Content Security Policy Directive ErrorsEncountering the enigmatic error "Refused to load the script..." when deployi...
    编程 发布于2025-04-17
  • 您如何在Laravel Blade模板中定义变量?
    您如何在Laravel Blade模板中定义变量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配变量对于存储以后使用的数据至关重要。在使用“ {{}}”分配变量的同时,它可能并不总是最优雅的解决方案。幸运的是,Blade通过@php Directive提供了更优雅的方法: $ old_section =“...
    编程 发布于2025-04-17
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-04-17
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-04-17

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3