首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
复杂数据类型
值类型和指针类型
值类型和指针类型的存储结构
为什么要区分值类型和指针类型
关于引用类型
slice(切片)的使用及实现原理
切片如何实现大小可变
切片的声明和定义
切片长度的扩展
切片容量的扩展
切片参数的复制
利用数组创建切片
利用切片创建切片
切片元素的修改
切片的循环处理
切片索引越界
总结切片操作的底层原理
map(映射)的使用及实现原理
声明和创建map
遍历map中的元素
元素查找与避免二义性
删除元素
map的存储结构解析
map元素的定位原理解析
map的容量扩展原理解析
channel(通道)的使用及实现原理
channel的使用
channel的实现原理
channel与消息队列、协程通信的对比
自定义结构体
自定义数据类型和自定义结构体
自定义结构体的使用
利用new创建实例
从自定义结构体看访问权限控制
自描述的访问权限
编程范例——结构体使用实例
利用自定义结构体实现bitmap
利用timer.Ticker实现定时任务
流程控制
分支控制
if语句实现分支控制
switch语句实现分支控制
分支控制的本质是向下跳转
避免多层if嵌套的技巧
循环控制
for循环
for-range循环
循环控制的本质是向上跳转
循环和递归的区别
跳转控制
goto关键字的使用
goto的本质是任意跳转
编程范例——流程控制的灵活使用
for循环的误区
switch-case的灵活使用
当前位置:
首页>>
技术小册>>
深入浅出Go语言核心编程(二)
小册名称:深入浅出Go语言核心编程(二)
### 章节标题:利用切片创建切片 在Go语言中,切片(slice)是一种非常强大且灵活的数据结构,它提供了对底层数组的抽象,使得对数组元素的操作更加便捷且动态。切片自身并不拥有其所包含的元素,而是对某个已存在数组的引用,并定义了自身的长度和容量。这种设计使得切片成为Go语言处理序列数据的首选方式之一。本章将深入探讨如何利用切片来创建新的切片,包括通过切片字面量、通过已有切片的部分、通过内置函数以及通过`append`函数动态扩展等几种常见方式。 #### 一、切片字面量直接创建 最直接创建切片的方式是使用切片字面量。切片字面量由一系列元素组成,元素之间用逗号分隔,整个序列被方括号`[]`包围。这种方式创建的切片会基于这些元素初始化一个新的底层数组,并返回指向这个数组的切片。 ```go // 创建一个包含整数的切片 s1 := []int{1, 2, 3, 4, 5} // 创建一个包含字符串的切片 s2 := []string{"Hello", "World", "Go", "Language"} ``` 这种方式简洁明了,适用于静态已知数据的情况。 #### 二、通过已有切片的部分创建新切片 Go语言允许我们通过指定已有切片的起始索引和结束索引(不包括结束索引的元素)来创建一个新的切片,这种方式不会复制底层数组的元素,而是创建一个新的切片结构,它引用了原有切片底层数组的一部分。 ```go s := []int{1, 2, 3, 4, 5, 6, 7, 8, 9} // 创建一个新的切片,包含s中索引1到4(不包括4)的元素 subSlice := s[1:4] fmt.Println(subSlice) // 输出:[2 3 4] ``` 注意,切片操作是引用原有切片的底层数组,因此修改子切片的内容可能会影响到原切片(如果它们在底层数组中重叠的话)。 #### 三、使用内置函数`copy`创建切片 虽然`copy`函数不是直接用来创建切片的,但它可以在创建新切片时用于复制已有切片的内容。这在你需要基于旧切片内容创建一个全新、独立切片时非常有用。 ```go s := []int{1, 2, 3, 4, 5} // 创建一个新的切片,并复制s的内容 newSlice := make([]int, len(s)) copy(newSlice, s) fmt.Println(newSlice) // 输出:[1 2 3 4 5] ``` 这里,`make`函数用于分配一个新的切片,`copy`函数则用于将旧切片的内容复制到新切片中。由于`newSlice`是独立分配的,修改`newSlice`的内容不会影响到`s`。 #### 四、通过`append`函数动态扩展切片 `append`函数是Go语言中处理切片时最常用的函数之一,它用于向切片末尾追加一个或多个元素,并返回一个新的切片(如果追加后的切片超出了原有容量,则可能会分配一个新的底层数组)。虽然`append`的主要用途是追加元素,但你也可以利用它的一些特性来“创建”新的切片。 ##### 4.1 追加单个或多个元素 ```go s := []int{1, 2, 3} s = append(s, 4) // 向s追加一个元素4 s = append(s, 5, 6) // 向s追加多个元素 fmt.Println(s) // 输出:[1 2 3 4 5 6] ``` ##### 4.2 利用`append`和切片字面量创建新切片 通过`append`和切片字面量的组合,你可以动态地创建一个新的切片,这在你需要根据条件动态添加元素时非常有用。 ```go s := []int{1, 2, 3} // 假设我们想根据某个条件向s追加一个切片字面量 if someCondition { s = append(s, []int{4, 5, 6}...) // 注意这里的...表示展开切片字面量 } fmt.Println(s) // 如果someCondition为true,则输出:[1 2 3 4 5 6] ``` 这里的`...`操作符是Go语言的一个特性,称为切片展开(slice splicing),它允许你将一个切片或数组的元素作为可变参数传递给函数,如`append`。 #### 五、使用`make`函数与`append`结合 虽然`make`函数主要用于初始化切片,但结合`append`使用时,它可以作为创建新切片并动态扩展其内容的起点。 ```go // 创建一个长度为0但容量为5的切片 s := make([]int, 0, 5) // 追加元素 s = append(s, 1, 2, 3) // 由于初始容量足够,此时s不需要重新分配底层数组 fmt.Println(s) // 输出:[1 2 3] // 继续追加,直到超出容量 s = append(s, 4, 5, 6) // 此时可能需要重新分配底层数组 fmt.Println(s) // 输出:[1 2 3 4 5 6] ``` 这种方式在需要预先分配一定空间以提高`append`操作效率时非常有用。 #### 总结 通过切片创建切片是Go语言编程中常见且重要的操作,它提供了灵活的数据处理方式。从直接的切片字面量创建,到通过已有切片的部分创建新切片,再到使用`copy`、`append`函数以及`make`函数与`append`结合的方式,Go语言为开发者提供了多种手段来根据需求创建和管理切片。理解和掌握这些操作对于编写高效、可维护的Go代码至关重要。
上一篇:
利用数组创建切片
下一篇:
切片元素的修改
该分类下的相关小册推荐:
Go开发权威指南(下)
Golang修炼指南
深入浅出Go语言核心编程(五)
Go Web编程(中)
深入浅出Go语言核心编程(六)
go编程权威指南(二)
Go Web编程(上)
Go开发权威指南(上)
Go 组件设计与实现
深入解析go语言
企业级Go应用开发从零开始
Golang并发编程实战