mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-12 00:11:36 +08:00
7.6
This commit is contained in:
@@ -137,4 +137,70 @@ func SearchStrings(a []string, x string) int
|
||||
|
||||
## 7.6.8 切片和垃圾回收
|
||||
|
||||
182
|
||||
切片的底层指向一个数组,该数组的实际体积可能要大于切片所定义的体积。只有在没有任何切片指向的时候,底层的数组内层才会被释放,这种特性有时会导致程序占用多余的内存。
|
||||
|
||||
**示例** 函数 `FindDigits` 将一个文件加载到内存,然后搜索其中所有的数字并返回一个切片。
|
||||
|
||||
```go
|
||||
var digitRegexp = regexp.MustCompile("[0-9]+")
|
||||
|
||||
func FindDigits(filename string) []byte {
|
||||
b, _ := ioutil.ReadFile(filename)
|
||||
return digitRegexp.Find(b)
|
||||
}
|
||||
```
|
||||
|
||||
这段代码可以顺利运行,但返回的 []byte 指向的底层是整个文件的数据。只要该返回的切片不被释放,垃圾回收器就不能释放整个文件所占用的内存。换句话说,一点点有用的数据却占用了整个文件的内存。
|
||||
|
||||
想要避免这个问题,可以通过拷贝我们需要的部分到一个新的切片中:
|
||||
|
||||
```go
|
||||
func FindDigits(filename string) []byte {
|
||||
b, _ := ioutil.ReadFile(filename)
|
||||
b = digitRegexp.Find(b)
|
||||
c := make([]byte, len(b))
|
||||
copy(c, b)
|
||||
return c
|
||||
}
|
||||
```
|
||||
|
||||
**练习 7.12**
|
||||
|
||||
编写一个函数,要求其接受两个参数,原始字符串 str 和分割索引 i,然后返回两个分割后的字符串。
|
||||
|
||||
**练习 7.13**
|
||||
|
||||
假设有字符串 str,那么 `str[len(str)/2:] + str[:len(str)/2]` 的结果是什么?
|
||||
|
||||
**练习 7.14**
|
||||
|
||||
编写一个程序,要求能够反转字符串,即将 “Google” 转换成 “elgooG”(提示:使用 []byte 类型的切片)。
|
||||
|
||||
如果您使用两个切片来实现反转,请再尝试使用一个切片(提示:使用交换法)。
|
||||
|
||||
如果您想要反转 Unicode 编码的字符串,请使用 []int 类型的切片。
|
||||
|
||||
**练习 7.15**
|
||||
|
||||
编写一个程序,要求能够遍历一个数组的字符,并将当前字符和前一个字符不相同的字符拷贝至另一个数组。
|
||||
|
||||
**练习 7.16**
|
||||
|
||||
编写一个程序,使用冒泡排序的方法排序一个包含整数的切片(算法的定义可参考 [维基百科](http://en.wikipedia.org/wiki/Bubble_sort))。
|
||||
|
||||
**练习 7.17**
|
||||
|
||||
在函数式编程语言中,一个 map-function 是指能够接受一个函数原型和一个列表,并使用列表中的值依次执行函数原型,公式为:`map ( F(), (e1,e2, . . . ,en) ) = ( F(e1), F(e2), ... F(en) )`。
|
||||
|
||||
编写一个函数 `mapFunc` 要求接受以下 2 个参数:
|
||||
|
||||
- 一个将整数乘以 10 的函数
|
||||
- 一个整数列表
|
||||
|
||||
最后返回保存运行结果的整数列表。
|
||||
|
||||
## 链接
|
||||
|
||||
- [目录](directory.md)
|
||||
- 上一节:[切片的复制与追加](07.5.md)
|
||||
- 下一章:[Maps](08.0.md)
|
||||
|
Reference in New Issue
Block a user