回到简体

This commit is contained in:
chai2010
2016-02-15 11:06:34 +08:00
parent 9e878f9944
commit 2b37b23285
177 changed files with 2354 additions and 2354 deletions

View File

@@ -1,6 +1,6 @@
### 4.2.2. Slice存技巧
### 4.2.2. Slice存技巧
讓我們看看更多的例子,比如镟轉slice、反slice或在slice原有存空間脩改元素。定一字符串列表下面的nonempty函數將在原有slice存空之上返不包含空字符串的列表:
让我们看看更多的例子,比如旋转slice、反slice或在slice原有存空间修改元素。定一字符串列表下面的nonempty函数将在原有slice存空之上返不包含空字符串的列表:
<u><i>gopl.io/ch4/nonempty</i></u>
```Go
@@ -23,7 +23,7 @@ func nonempty(strings []string) []string {
}
```
微妙的地方是,入的slice和出的slice共享一個底層數組。這可以避免分配另一個數組,不過原來的數據將可能被覆,正如下面兩個打印句看到的那
微妙的地方是,入的slice和出的slice共享一个底层数组。这可以避免分配另一个数组,不过原来的数据将可能被覆,正如下面两个打印句看到的那
```Go
data := []string{"one", "", "three"}
@@ -31,9 +31,9 @@ fmt.Printf("%q\n", nonempty(data)) // `["one" "three"]`
fmt.Printf("%q\n", data) // `["one" "three" "three"]`
```
因此我通常會這樣使用nonempty函`data = nonempty(data)`
因此我通常会这样使用nonempty函`data = nonempty(data)`
nonempty函也可以使用append函數實現
nonempty函也可以使用append函数实现
```Go
func nonempty2(strings []string) []string {
@@ -47,27 +47,27 @@ func nonempty2(strings []string) []string {
}
```
無論如何實現,以這種方式重用一slice一般都要求最多爲每個輸入值生一個輸出值,事上很多這類算法都是用來過濾或合序列中相的元素。這種slice用法是比較複雜的技巧,然使用到了slice的一些技巧但是對於某些合是比清晰和有效的。
无论如何实现,以这种方式重用一slice一般都要求最多为每个输入值生一个输出值,事上很多这类算法都是用来过滤或合序列中相的元素。这种slice用法是比较复杂的技巧,然使用到了slice的一些技巧但是对于某些合是比清晰和有效的。
slice可以用來模擬一個stack。最初定的空slice對應一個空的stack可以使用append函數將新的值入stack
slice可以用来模拟一个stack。最初定的空slice对应一个空的stack可以使用append函数将新的值入stack
```Go
stack = append(stack, v) // push v
```
stack的部位置對應slice的最後一個元素:
stack的部位置对应slice的最后一个元素:
```Go
top := stack[len(stack)-1] // top of stack
```
過收縮stack可以彈出棧頂的元素
过收缩stack可以弹出栈顶的元素
```Go
stack = stack[:len(stack)-1] // pop
```
除slice中的某元素保存原有的元素序,可以通過內置的copy函數將後面的子slice向前依次移一位完成:
除slice中的某元素保存原有的元素序,可以通过内置的copy函数将后面的子slice向前依次移一位完成:
```Go
func remove(slice []int, i int) []int {
@@ -81,7 +81,7 @@ func main() {
}
```
如果除元素不用保持原來順序的,我可以簡單的用最後一個元素覆蓋被刪除的元素:
如果除元素不用保持原来顺序的,我可以简单的用最后一个元素覆盖被删除的元素:
```Go
func remove(slice []int, i int) []int {
@@ -95,12 +95,12 @@ func main() {
}
```
**練習 4.3**reverse函,使用數組指針代替slice。
**练习 4.3**reverse函,使用数组指针代替slice。
**練習 4.4** 編寫一個rotate函,通一次循完成镟轉
**练习 4.4** 编写一个rotate函,通一次循完成旋转
**練習 4.5** 寫一個函數在原地完成消除[]string中相鄰重複的字符串的操作。
**练习 4.5** 写一个函数在原地完成消除[]string中相邻重复的字符串的操作。
**練習 4.6** 編寫一個函數,原地將一個UTF-8編碼的[]byte型的slice中相的空格(考unicode.IsSpace成一空格返
**练习 4.6** 编写一个函数,原地将一个UTF-8编码的[]byte型的slice中相的空格(考unicode.IsSpace成一空格返
**練習 4.7** 改reverse函數用於原地反UTF-8編碼的[]byte。是否可以不用分配外的存?
**练习 4.7** 改reverse函数用于原地反UTF-8编码的[]byte。是否可以不用分配外的存?