7-8 章修改 (#842)

Co-authored-by: Joe Chen <jc@unknwon.io>
This commit is contained in:
Haigang Zhou
2022-05-10 13:53:30 +08:00
committed by GitHub
parent c42d8a340a
commit 30ca13a369
14 changed files with 195 additions and 180 deletions

View File

@@ -1,6 +1,6 @@
# 7.5 切片的复制与追加
如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。下面的代码描述了从拷贝切片的 copy 函数和向切片追加新元素的 append 函数。
如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。下面的代码描述了从拷贝切片的 `copy` 函数和向切片追加新元素的 `append()` 函数。
示例 7.12 [copy_append_slice.go](examples/chapter_7/copy_append_slice.go)
@@ -22,11 +22,11 @@ func main() {
}
```
`func append(s[]T, x ...T) []T` 其中 append 方法将 0 个或多个具有相同类型 s 的元素追加到切片后面并且返回新的切片;追加的元素必须和原切片的元素是同类型。如果 s 的容量不足以存储新增元素append 会分配新的切片来保证已有切片元素和新增元素的存储。因此返回的切片可能已经指向一个不同的相关数组了。append 方法总是返回成功,除非系统内存耗尽了。
`func append(s[]T, x ...T) []T` 其中 `append()` 方法将 0 个或多个具有相同类型 `s` 的元素追加到切片后面并且返回新的切片;追加的元素必须和原切片的元素是同类型。如果 `s` 的容量不足以存储新增元素,`append()` 会分配新的切片来保证已有切片元素和新增元素的存储。因此,返回的切片可能已经指向一个不同的相关数组了。`append()` 方法总是返回成功,除非系统内存耗尽了。
如果你想将切片 y 追加到切片 x 后面,只要将第二个参数扩展成一个列表即可:`x = append(x, y...)`
如果你想将切片 `y` 追加到切片 `x` 后面,只要将第二个参数扩展成一个列表即可:`x = append(x, y...)`
**注意** append 在大多数情况下很好用,但是如果你想完全掌控整个追加过程,你可以实现一个这样的 AppendByte 方法:
**注意** `append()` 在大多数情况下很好用,但是如果你想完全掌控整个追加过程,你可以实现一个这样的 `AppendByte()` 方法:
```go
func AppendByte(slice []byte, data ...byte) []byte {
@@ -44,26 +44,26 @@ func AppendByte(slice []byte, data ...byte) []byte {
}
```
`func copy(dst, src []T) int` copy 方法将类型为 T 的切片从源地址 src 拷贝到目标地址 dst覆盖 dst 的相关元素,并且返回拷贝的元素个数。源地址和目标地址可能会有重叠。拷贝个数是 src 和 dst 的长度最小值。如果 src 是字符串那么元素类型就是 byte。如果你还想继续使用 src在拷贝结束后执行 `src = dst`
`func copy(dst, src []T) int` 方法将类型为 `T` 的切片从源地址 `src` 拷贝到目标地址 `dst`,覆盖 `dst` 的相关元素,并且返回拷贝的元素个数。源地址和目标地址可能会有重叠。拷贝个数是 `src``dst` 的长度最小值。如果 `src` 是字符串那么元素类型就是 `byte`。如果你还想继续使用 `src`,在拷贝结束后执行 `src = dst`
**练习 7.9**
**练习 7.9** [magnify_slice.go](exercises/chapter_7/magnify_slice.go)
给定一个slice`s []int` 和一个 int 类型的因子factor扩展 s 使其长度为 `len(s) * factor`
给定一个切片 `s []int` 和一个 `int` 类型的因子 `factor`,扩展 `s` 使其长度为 `len(s) * factor`
**练习 7.10**
**练习 7.10 ** [filter_slice.go](exercises/chapter_7/filter_slice.go)
用顺序函数过滤容器:s 是前 10 个整型的切片。构造一个函数 Filter第一个参数是 s,第二个参数是一个 `fn func(int) bool`,返回满足函数 fn 的元素切片。通过 fn 测试方法测试当整型值是偶数时的情况。
用顺序函数过滤容器:`s` 是前 10 个整型的切片。构造一个函数 `Filter`,第一个参数是 `s`,第二个参数是一个 `fn func(int) bool`,返回满足函数 `fn` 的元素切片。通过 `fn` 测试方法测试当整型值是偶数时的情况。
**练习 7.11**
**练习 7.11** [insert_slice.go](exercises/chapter_7/insert_slice.go)
写一个函数 InsertStringSlice 将切片插入到另一个切片的指定位置。
写一个函数 `InsertStringSlice()` 将切片插入到另一个切片的指定位置。
**练习 7.12**
**练习 7.12** [remove_slice.go](exercises/chapter_7/remove_slice.go)
写一个函数 RemoveStringSlice 将从 start 到 end 索引的元素从切片中移除。
写一个函数 `RemoveStringSlice()` 将从 `start``end` 索引的元素从切片中移除。
## 链接
- [目录](directory.md)
- 上一节:[切片重组reslice](07.4.md)
- 上一节:[切片重组 (reslice)](07.4.md)
- 下一节:[字符串、数组和切片的应用](07.6.md)