回到简体

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,14 +1,14 @@
### 3.5.4. 字符串和Byte切片
標準庫中有四個包對字符串理尤重要bytes、strings、strconv和unicode包。strings包提供了多如字符串的査詢、替、比、截、拆分和合等功能。
标准库中有四个包对字符串理尤重要bytes、strings、strconv和unicode包。strings包提供了多如字符串的查询、替、比、截、拆分和合等功能。
bytes包也提供了很多似功能的函,但是針對和字符串有着相同結構的[]byte型。因字符串是隻讀的,因此逐步建字符串會導致很多分配和複製。在這種情況使用bytes.Buffer類型將會更有效,稍後我們將展示。
bytes包也提供了很多似功能的函,但是针对和字符串有着相同结构的[]byte型。因字符串是只读的,因此逐步建字符串会导致很多分配和复制。在这种情况使用bytes.Buffer类型将会更有效,稍后我们将展示。
strconv包提供了布型、整型、浮點數和對應字符串的相互轉換,還提供了雙引號轉義相關的轉換
strconv包提供了布型、整型、浮点数和对应字符串的相互转换,还提供了双引号转义相关的转换
unicode包提供了IsDigit、IsLetter、IsUpper和IsLower等似功能,它們用於給字符分。每個函數有一個單一的rune型的參數,然後返迴一個布爾值。而像ToUpper和ToLower之類的轉換函數將用於rune字符的大小寫轉換。所有的些函都是遵循Unicode標準定義的字母、字等分類規范。strings包也有似的函,它是ToUpper和ToLower原始字符串的每字符都做相應的轉換,然後返迴新的字符串。
unicode包提供了IsDigit、IsLetter、IsUpper和IsLower等似功能,它们用于给字符分。每个函数有一个单一的rune型的参数,然后返回一个布尔值。而像ToUpper和ToLower之类的转换函数将用于rune字符的大小写转换。所有的些函都是遵循Unicode标准定义的字母、字等分类规范。strings包也有似的函,它是ToUpper和ToLower原始字符串的每字符都做相应的转换,然后返回新的字符串。
下面例子的basename函數靈感於Unix shell的同名工具。在我們實現的版本中basename(s)看起像是繫統路徑的前綴刪除,同時將看似文件型的後綴名部分除:
下面例子的basename函数灵感于Unix shell的同名工具。在我们实现的版本中basename(s)看起像是系统路径的前缀删除,同时将看似文件型的后缀名部分除:
```Go
fmt.Println(basename("a/b/c.go")) // "c"
@@ -16,7 +16,7 @@ fmt.Println(basename("c.d.go")) // "c.d"
fmt.Println(basename("abc")) // "abc"
```
第一版本併沒有使用任何,全部手工硬編碼實現
第一版本并没有使用任何,全部手工硬编码实现
<u><i>gopl.io/ch3/basename1</i></u>
```Go
@@ -41,7 +41,7 @@ func basename(s string) string {
}
```
簡化個版本使用了strings.LastIndex庫函數
简化个版本使用了strings.LastIndex库函数
<u><i>gopl.io/ch3/basename2</i></u>
```Go
@@ -55,9 +55,9 @@ func basename(s string) string {
}
```
path和path/filepath包提供了關於文件路名更一般的函操作。使用斜分隔路可以在任何操作繫統上工作。斜本身不應該用於文件名,但是在其他一些域可能會用於文件名例如URL路徑組件。相比之下path/filepath包使用操作繫統本身的路徑規則例如POSIX繫統使用/foo/bar而Microsoft Windows使用c:\foo\bar等。
path和path/filepath包提供了关于文件路名更一般的函操作。使用斜分隔路可以在任何操作系统上工作。斜本身不应该用于文件名,但是在其他一些域可能会用于文件名例如URL路径组件。相比之下path/filepath包使用操作系统本身的路径规则例如POSIX系统使用/foo/bar而Microsoft Windows使用c:\foo\bar等。
讓我們繼續另一字符串的例子。函的功能是將一個表示整值的字符串,每隔三字符插入一個逗號分隔符例如“12345”處理後成爲“12,345”。這個版本隻適用於整數類型;支持浮點數類型的支持留作練習
让我们继续另一字符串的例子。函的功能是将一个表示整值的字符串,每隔三字符插入一个逗号分隔符例如“12345”处理后成为“12,345”。这个版本只适用于整数类型;支持浮点数类型的支持留作练习
<u><i>gopl.io/ch3/comma</i></u>
```Go
@@ -71,11 +71,11 @@ func comma(s string) string {
}
```
入comma函數的參數是一字符串。如果入字符串的度小或等3的話,則不需要插入逗分隔符。否comma函數將在最後三個字符前位置字符串切割爲兩個兩個子串插入逗分隔符,然後通過遞歸調用自身出前面的子串。
入comma函数的参数是一字符串。如果入字符串的度小或等3的话,则不需要插入逗分隔符。否comma函数将在最后三个字符前位置字符串切割为两个两个子串插入逗分隔符,然后通过递归调用自身出前面的子串。
字符串是包含的隻讀字節數組,一旦建,是不可的。相比之下,一個字節slice的元素可以自由地改。
字符串是包含的只读字节数组,一旦建,是不可的。相比之下,一个字节slice的元素可以自由地改。
字符串和字slice之可以相互轉換
字符串和字slice之可以相互转换
```Go
s := "abc"
@@ -83,9 +83,9 @@ b := []byte(s)
s2 := string(b)
```
概念上,一[]byte(s)轉換是分配了一新的字節數組用於保存字符串數據的拷,然引用這個底層的字節數組。編譯器的化可以避免在一些景下分配和複製字符串數據,但總的來説需要保在量b被改的情原始的s字符串也不會改變。將一個字節slice到字符串的string(b)操作則是構造一字符串拷,以保s2字符串是隻讀的。
概念上,一[]byte(s)转换是分配了一新的字节数组用于保存字符串数据的拷,然引用这个底层的字节数组。编译器的化可以避免在一些景下分配和复制字符串数据,但总的来说需要保在量b被改的情原始的s字符串也不会改变。将一个字节slice到字符串的string(b)操作则是构造一字符串拷,以保s2字符串是只读的。
了避免轉換中不必要的存分配bytes包和strings同提供了許多實用函。下面是strings包中的六個函數
了避免转换中不必要的存分配bytes包和strings同提供了许多实用函。下面是strings包中的六个函数
```Go
func Contains(s, substr string) bool
@@ -96,7 +96,7 @@ func Index(s, sep string) int
func Join(a []string, sep string) string
```
bytes包中也對應的六個函數
bytes包中也对应的六个函数
```Go
func Contains(b, subslice []byte) bool
@@ -107,9 +107,9 @@ func Index(s, sep []byte) int
func Join(s [][]byte, sep []byte) []byte
```
們之間唯一的别是字符串類型參數被替成了字slice型的參數
们之间唯一的别是字符串类型参数被替成了字slice型的参数
bytes包提供了Buffer型用於字節slice的存。一Buffer始是空的,但是着string、byte或[]byte等類型數據的寫入可以動態增長,一bytes.Buffer變量併不需要理化,因零值也是有效的:
bytes包提供了Buffer型用于字节slice的存。一Buffer始是空的,但是着string、byte或[]byte等类型数据的写入可以动态增长,一bytes.Buffer变量并不需要理化,因零值也是有效的:
<u><i>gopl.io/ch3/printints</i></u>
```Go
@@ -132,12 +132,12 @@ func main() {
}
```
向bytes.Buffer添加任意字符的UTF8編碼時最好使用bytes.Buffer的WriteRune方法但是WriteByte方法對於寫入類似'['和']'等ASCII字符則會更加有效。
向bytes.Buffer添加任意字符的UTF8编码时最好使用bytes.Buffer的WriteRune方法但是WriteByte方法对于写入类似'['和']'等ASCII字符则会更加有效。
bytes.Buffer型有着很多用的功能,我在第七章討論接口時將會涉及到,我們將看看如何它用作一I/O的入和輸出對象,例如做Fprintf的io.Writer輸出對象,或者作io.Reader型的入源象。
bytes.Buffer型有着很多用的功能,我在第七章讨论接口时将会涉及到,我们将看看如何它用作一I/O的入和输出对象,例如做Fprintf的io.Writer输出对象,或者作io.Reader型的入源象。
**練習 3.10** 編寫一個非遞歸版本的comma函使用bytes.Buffer代替字符串接操作。
**练习 3.10** 编写一个非递归版本的comma函使用bytes.Buffer代替字符串接操作。
**練習 3.11** 完善comma函,以支持浮點數處理和一個可選的正負號的處理。
**练习 3.11** 完善comma函,以支持浮点数处理和一个可选的正负号的处理。
**練習 3.12** 編寫一個函數,判斷兩個字符串是否是是相互打的,也就是説它們有着相同的字符,但是對應不同的序。
**练习 3.12** 编写一个函数,判断两个字符串是否是是相互打的,也就是说它们有着相同的字符,但是对应不同的序。