mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2025-10-25 07:42:16 +00:00
ch4-2, ch4-3: review
This commit is contained in:
@@ -32,7 +32,7 @@ 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函數實現:
|
||||
|
||||
@@ -48,9 +48,9 @@ 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
|
||||
@@ -68,7 +68,7 @@ top := stack[len(stack)-1] // top of stack
|
||||
stack = stack[:len(stack)-1] // pop
|
||||
```
|
||||
|
||||
要刪除slice中間的某個元素併保存原有的元素順序,可以通過內置的copy函數將後面的子slice向前一位複雜完成:
|
||||
要刪除slice中間的某個元素併保存原有的元素順序,可以通過內置的copy函數將後面的子slice向前依次移動一位完成:
|
||||
|
||||
```Go
|
||||
func remove(slice []int, i int) []int {
|
||||
@@ -82,7 +82,7 @@ func main() {
|
||||
}
|
||||
```
|
||||
|
||||
如果刪除元素後不用保存原來順序的話,我們可以簡單的用最後一個元素覆蓋被刪除的元素:
|
||||
如果刪除元素後不用保持原來順序的話,我們可以簡單的用最後一個元素覆蓋被刪除的元素:
|
||||
|
||||
```Go
|
||||
func remove(slice []int, i int) []int {
|
||||
@@ -105,4 +105,3 @@ func main() {
|
||||
**練習 4.6:** 編寫一個函數,原地將一個UTF-8編碼的[]byte類型的slice中相鄰的空格(參考unicode.IsSpace)替換成一個空格返迴
|
||||
|
||||
**練習 4.7:** 脩改reverse函數用於原地反轉UTF-8編碼的[]byte。是否可以不用分配額外的內存?
|
||||
|
||||
|
||||
Reference in New Issue
Block a user