> go语言github项目:https://github.com/minibear2333/how_to_code
上一节说了切片与数组的区别,动态增加,len cap append copy 的知识,下面我补充一点。
[TOC]
### 切片的复制
切片的复制,回顾一下,我们原来是用`copy`函数
```go
slice2 := make([]int, len(slice1), cap(slice1))
/* 拷贝 slice1 的内容到 slice2 */
copy(slice2, slice1) // 注意是后面的拷贝给前面
```
切片还有一种方式复制方式,比较快速
```go
slice3 := slice2[:]
```
但是有一种致命的缺点,这是浅拷贝,`slice3`和`slice2`是同一个切片,无论改动哪个,另一个都会产生变化。
### 截取部分元素
切片之所以为切片,就是可以把部分元素截取出来
`slice2`的值是`[0 0 0 4 5 6]`,现在有一个需求,要截取第2个元素出来
```go
slice3 := slice2[0:1]
```
输出
```
len=1 cap=10 slice=[0]
```
我们分别修改`slice3`和`slice2`
```go
slice3[0] = 1
slice2[0] = 2
printSlice(slice2)
printSlice(slice3)
```
发现输出
```
len=6 cap=10 slice=[2 0 0 4 5 6]
len=1 cap=10 slice=[2]
```
说明,截取出现的元素依然是同一块内存(切片是引用类型的)。
所以截取部分元素之后,还是得用copy来复制一遍,如下。
```go
slice2 = []int{0, 0, 0, 1, 2, 3}
slice3 = make([]int, 1, 1)
copy(slice3, slice2[0:1])
```
### 工具函数补充
排序工具函数
```go
slice2 = []int{0, 3, 0, 1, 2, 0}
sort.Ints(slice2)
fmt.Println(slice2)
```
输出
```
[0 0 0 1 2 3]
```
其他知识参考 [排序用户自定义数据集]( https://coding3min.com/785.html)
- 安装与下载
- 投稿大纲
- 第一章、跑起来
- 为什么要学 go 语言?
- 让你的 Golang 项目在 IDE 里跑起来
- 第一个 go 程序
- go mod最佳实践
- 第二章、语言基础
- 声明【变量】的各种方式
- 常量+各种类型转换
- switch和type switch
- 循环语句的多种形式、死循环、break/continue
- range深度解析
- 第三章、函数和容器
- 函数简单使用和基本知识解析
- 匿名函数和闭包
- 可变参数
- 集合(map)
- 数组和切片
- 切片知识补充
- 第四章、指针、结构体、接口和异常处理
- 指针讨论
- 结构体
- 接口与多态
- 异常处理
- 第五章、再学一点运用自如
- 其他常用操作
- Go文件操作大全
- Go代码基本标准规范
- 切片排序sort包的使用
- Golang打镜像Dockerfile的写法
- 等待goroutine完成任务,循环中使用goroutine
- kinping.flag包读取命令行配置