Unknwon пре 11 година
родитељ
комит
682e26fa38
4 измењених фајлова са 90 додато и 13 уклоњено
  1. 1 1
      README.md
  2. 16 8
      eBook/07.5.md
  3. 67 1
      eBook/07.6.md
  4. 6 3
      eBook/08.0.md

+ 1 - 1
README.md

@@ -9,7 +9,7 @@
 
 
 ## 翻译进度
 ## 翻译进度
 
 
-7.5 [切片的复制与追加](eBook/07.5.md)
+7.6 [字符串、数组和切片的应用](eBook/07.6.md)
 
 
 ## 支持本书
 ## 支持本书
 
 

+ 16 - 8
eBook/07.5.md

@@ -3,18 +3,18 @@
 如果想增加 slice 的容量,我们必须创建一个新的更大的 slice 并把原分片的内容都拷贝过来。下面的代码描述了从拷贝 slice 的 copy 方法和向 slice 追加新元素的 append 方法。
 如果想增加 slice 的容量,我们必须创建一个新的更大的 slice 并把原分片的内容都拷贝过来。下面的代码描述了从拷贝 slice 的 copy 方法和向 slice 追加新元素的 append 方法。
 
 
 示例 7.12 [copy_append_slice.go](examples/chapter_7/copy_append_slice.go)
 示例 7.12 [copy_append_slice.go](examples/chapter_7/copy_append_slice.go)
-          
+
     package main
     package main
     import "fmt"
     import "fmt"
-    
+
     func main() {
     func main() {
     	sl_from := []int{1, 2, 3}
     	sl_from := []int{1, 2, 3}
     	sl_to := make([]int, 10)
     	sl_to := make([]int, 10)
-    
+
     	n := copy(sl_to, sl_from)
     	n := copy(sl_to, sl_from)
     	fmt.Println(sl_to)
     	fmt.Println(sl_to)
     	fmt.Printf("Copied %d elements\n", n) // n == 3
     	fmt.Printf("Copied %d elements\n", n) // n == 3
-    
+
     	sl3 := []int{1, 2, 3}
     	sl3 := []int{1, 2, 3}
     	sl3 = append(sl3, 4, 5, 6)
     	sl3 = append(sl3, 4, 5, 6)
     	fmt.Println(sl3)
     	fmt.Println(sl3)
@@ -44,13 +44,21 @@ func AppendByte(slice []byte, data ...byte) []byte {
 
 
 `func copy(dst, src []T) int` copy 方法将类型为 T 的 slice 从源地址 src 拷贝到目标地址 dst,覆盖 dst 的相关元素,并且返回拷贝的元素个数。源地址和目标地址可能会有重叠。拷贝个数是 src 和 dst 的长度最小值。如果 src 是字符串那么元素类型就是 byte。如果你还想继续使用 src,在拷贝技术后执行 src =dst。
 `func copy(dst, src []T) int` copy 方法将类型为 T 的 slice 从源地址 src 拷贝到目标地址 dst,覆盖 dst 的相关元素,并且返回拷贝的元素个数。源地址和目标地址可能会有重叠。拷贝个数是 src 和 dst 的长度最小值。如果 src 是字符串那么元素类型就是 byte。如果你还想继续使用 src,在拷贝技术后执行 src =dst。
 
 
-练习 7.9: magnify_slice.go: 给定 `slice s[]int` 和一个 int 类型的因子,扩展 s 使其长度为 `len(s) * factor`。
+**练习 7.9**
+
+给定 `slice s[]int` 和一个 int 类型的因子,扩展 s 使其长度为 `len(s) * factor`。
+
+**练习 7.10**
+
+用顺序函数过滤容器:s 是前 10 个整形的 slice。构造一个函数 Filter,第一个参数是 s,第二个参数是一个 `fn func(int) bool`,返回满足函数 fn 的元素 slice。通过 fn 测试方法测试当整型值是偶数时的情况。
+
+**练习 7.11**
 
 
-练习 7.10:filter_slice.go: 用顺序函数过滤容器:s 是前 10 个整形的 slice。构造一个函数 Filter,第一个参数是 s,第二个参数是一个 `fn func(int) bool`,返回满足函数 fn 的元素 slice。通过 fn 测试方法测试当整型值是偶数时的情况。
+写一个函数 InsertStringSlice 将 slice 插入到另一个 slice 的指定位置
 
 
-练习 7.11:insert_slice.go:写一个函数 InsertStringSlice 将 slice 插入到另一个 slice 的指定位置。
+**练习 7.12**
 
 
-练习 7.12:remove_slice.go:写一个函数 RemoveStringSlice 将从 start 到 end 索引的元素从 slice 中移除。
+写一个函数 RemoveStringSlice 将从 start 到 end 索引的元素从 slice 中移除。
 
 
 ## 链接
 ## 链接
 
 

+ 67 - 1
eBook/07.6.md

@@ -137,4 +137,70 @@ func SearchStrings(a []string, x string) int
 
 
 ## 7.6.8 切片和垃圾回收
 ## 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)

+ 6 - 3
eBook/08.0.md

@@ -1,9 +1,12 @@
-#8.0 Maps
+# 8.0 Maps
+
+185
+
 Maps是一种特殊的数据结构:一种元素对(pair)的无序集合,pair的一个元素是key,对应的另一个元素是value,所以这个结构也称为关联数组或字典。这是一种快速寻找值的理想结构:给定key,对应的value可以迅速定位。
 Maps是一种特殊的数据结构:一种元素对(pair)的无序集合,pair的一个元素是key,对应的另一个元素是value,所以这个结构也称为关联数组或字典。这是一种快速寻找值的理想结构:给定key,对应的value可以迅速定位。
 
 
 Maps这种数据结构在其他编程语言中也称为字典(Python),hash,HashTable等。
 Maps这种数据结构在其他编程语言中也称为字典(Python),hash,HashTable等。
 
 
 ##链接
 ##链接
 - [目录](directory.md)
 - [目录](directory.md)
-- 上一节:[]()
-- 下一节:[声明,初始化和make](08.1.md)
+- 上一章:[字符串、数组和切片的应用](07.6.md)
+- 下一节:[声明,初始化和make](08.1.md)