Go语言多维切片 图片看不了?点击切换HTTP 返回上层
Go语言中切片和数组一样也是一维的。不过,和之前对数组的讨论一样,可以组合多个切片形成多维切片,如下所示。
![](http://search.zixuephp.com/public/uploads/2019-09-09/201909091055415d75bf2d4e1ed.gif)
图:整型切片的切片的值
在上图中可以看到组合切片的操作是如何将一个切片嵌入到另一个切片中的。外层的切片包括两个元素,每个元素都是一个切片。第一个元素中的切片使用单个整数 10 来初始化,第二个元素中的切片包括两个整数,即 100 和 200。
这种组合可以让用户创建非常复杂且强大的数据结构。已经学过的关于内置函数 append 的规则也可以应用到组合后的切片上,如下所示。
【示例】组合切片的切片
![](http://search.zixuephp.com/public/uploads/2019-09-09/201909091055415d75bf2d7bdf0.gif)
图:append 操作之后外层切片索引为 0 的元素的布局
即便是这么简单的多维切片,操作时也会涉及众多布局和值。看起来在函数间像这样传递数据结构也会很复杂。不过切片本身结构很简单,可以以很小的成本在函数间传递。
// 创建一个整型切片的切片 slice := [][]int{{10}, {100, 200}}我们有了一个包含两个元素的外层切片,每个元素包含一个内层的整型切片。切片 slice 的值看起来像下图展示的样子。
![](http://search.zixuephp.com/public/uploads/2019-09-09/201909091055415d75bf2d4e1ed.gif)
图:整型切片的切片的值
在上图中可以看到组合切片的操作是如何将一个切片嵌入到另一个切片中的。外层的切片包括两个元素,每个元素都是一个切片。第一个元素中的切片使用单个整数 10 来初始化,第二个元素中的切片包括两个整数,即 100 和 200。
这种组合可以让用户创建非常复杂且强大的数据结构。已经学过的关于内置函数 append 的规则也可以应用到组合后的切片上,如下所示。
【示例】组合切片的切片
// 创建一个整型切片的切片 slice := [][]int{{10}, {100, 200}} // 为第一个切片追加值为 20 的元素 slice[0] = append(slice[0], 20)Go语言里使用 append 函数处理追加的方式很简明:先增长切片,再将新的整型切片赋值给外层切片的第一个元素。当上面代码中的操作完成后,会为新的整型切片分配新的底层数组,然后将切片复制到外层切片的索引为 0 的元素,如下图所示。
![](http://search.zixuephp.com/public/uploads/2019-09-09/201909091055415d75bf2d7bdf0.gif)
图:append 操作之后外层切片索引为 0 的元素的布局
即便是这么简单的多维切片,操作时也会涉及众多布局和值。看起来在函数间像这样传递数据结构也会很复杂。不过切片本身结构很简单,可以以很小的成本在函数间传递。