鍍金池/ 教程/ GO/ 4.7 strings 和 strconv 包
4.7 strings 和 strconv 包
13.6 啟動(dòng)外部命令和程序
?# 11.4 類型判斷:type-switch
12.1 讀取用戶的輸入
10.6 方法
12.2 文件讀寫
13 錯(cuò)誤處理與測(cè)試
9.3 鎖和 sync 包
12.3 文件拷貝
?# 11.7 第一個(gè)例子:使用 Sorter 接口排序
?# 11.5 測(cè)試一個(gè)值是否實(shí)現(xiàn)了某個(gè)接口
6.4 defer 和追蹤
12.10 XML 數(shù)據(jù)格式
13.10 性能調(diào)試:分析并優(yōu)化 Go 程序
?# 11.1 接口是什么
2.2 Go 環(huán)境變量
2.6 安裝目錄清單
2.5 在 Windows 上安裝 Go
11.11 Printf 和反射
1.2 語(yǔ)言的主要特性與發(fā)展的環(huán)境和影響因素
9.0 包(package)
7.4 切片重組(reslice)
13.2 運(yùn)行時(shí)異常和 panic
10.2 使用工廠方法創(chuàng)建結(jié)構(gòu)體實(shí)例
12.8 使用接口的實(shí)際例子:fmt.Fprintf
2.4 在 Mac OS X 上安裝 Go
3.8 Go 性能說明
7.2 切片
8.0 Map
3.1 Go 開發(fā)環(huán)境的基本要求
5.6 標(biāo)簽與 goto
6.10 使用閉包調(diào)試
9.5 自定義包和可見性
4.3 常量
?# 11.2 接口嵌套接口
6.5 內(nèi)置函數(shù)
前言
10.8 垃圾回收和 SetFinalizer
2.8 Go 解釋器
13.7 Go 中的單元測(cè)試和基準(zhǔn)測(cè)試
6.8 閉包
4.9 指針
13.1 錯(cuò)誤處理
10.1 結(jié)構(gòu)體定義
5.1 if-else 結(jié)構(gòu)
6.6 遞歸函數(shù)
9.9 通過 Git 打包和安裝
2.7 Go 運(yùn)行時(shí)(runtime)
10.7 類型的 String() 方法和格式化描述符
3.7 其它工具
9.6 為自定義包使用 godoc
11.12 接口與動(dòng)態(tài)類型
13.3 從 panic 中恢復(fù)(Recover)
10.3 使用自定義包中的結(jié)構(gòu)體
11.14 結(jié)構(gòu)體、集合和高階函數(shù)
3.6 生成代碼文檔
9.2 regexp 包
4.1 文件名、關(guān)鍵字與標(biāo)識(shí)符
?# 11.6 使用方法集與接口
7.0 數(shù)組與切片
7.1 聲明和初始化
12.11 用 Gob 傳輸數(shù)據(jù)
5.5 Break 與 continue
1.1 起源與發(fā)展
?# 11 接口(Interfaces)與反射(reflection)
6.9 應(yīng)用閉包:將函數(shù)作為返回值
4.2 Go 程序的基本結(jié)構(gòu)和要素
8.6 將 map 的鍵值對(duì)調(diào)
6.11 計(jì)算函數(shù)執(zhí)行時(shí)間
5.0 控制結(jié)構(gòu)
10.5 匿名字段和內(nèi)嵌結(jié)構(gòu)體
4.6 字符串
3.0 編輯器、集成開發(fā)環(huán)境與其它工具
13.8 測(cè)試的具體例子
7.6 字符串、數(shù)組和切片的應(yīng)用
8.4 map 類型的切片
3.9 與其它語(yǔ)言進(jìn)行交互
7.3 For-range 結(jié)構(gòu)
9.7 使用 go install 安裝自定義包
6.0 函數(shù)
9.8 自定義包的目錄結(jié)構(gòu)、go install 和 go test
6.3 傳遞變長(zhǎng)參數(shù)
13.9 用(測(cè)試數(shù)據(jù))表驅(qū)動(dòng)測(cè)試
11.9 空接口
8.1 聲明、初始化和 make
6.2 函數(shù)參數(shù)與返回值
9.11 在 Go 程序中使用外部庫(kù)
3.3 調(diào)試器
4.5 基本類型和運(yùn)算符
?# 11.8 第二個(gè)例子:讀和寫
12.5 用 buffer 讀取文件
總結(jié):Go 中的面向?qū)ο?/span>
11.10 反射包
12.7 用 defer 關(guān)閉文件
9.4 精密計(jì)算和 big 包
4.4 變量
6.1 介紹
13.4 自定義包中的錯(cuò)誤處理和 panicking
12.4 從命令行讀取參數(shù)
9.10 Go 的外部包和項(xiàng)目
8.3 for-range 的配套用法
3.5 格式化代碼
10.4 帶標(biāo)簽的結(jié)構(gòu)體
7.5 切片的復(fù)制與追加
?# 11.3 類型斷言:如何檢測(cè)和轉(zhuǎn)換接口變量的類型
5.4 for 結(jié)構(gòu)
4.8 時(shí)間和日期
2.3 在 Linux 上安裝 Go
12 讀寫數(shù)據(jù)
6.12 通過內(nèi)存緩存來提升性能
9.1 標(biāo)準(zhǔn)庫(kù)概述
12.6 用切片讀寫文件
10 結(jié)構(gòu)(struct)與方法(method)
8.5 map 的排序
12.9 JSON 數(shù)據(jù)格式
13.5 一種用閉包處理錯(cuò)誤的模式
3.2 編輯器和集成開發(fā)環(huán)境
12.12 Go 中的密碼學(xué)
5.2 測(cè)試多返回值函數(shù)的錯(cuò)誤
6.7 將函數(shù)作為參數(shù)
8.2 測(cè)試鍵值對(duì)是否存在及刪除元素
3.4 構(gòu)建并運(yùn)行 Go 程序
2.1 平臺(tái)與架構(gòu)
5.3 switch 結(jié)構(gòu)

4.7 strings 和 strconv 包

作為一種基本數(shù)據(jù)結(jié)構(gòu),每種語(yǔ)言都有一些對(duì)于字符串的預(yù)定義處理函數(shù)。Go 中使用 strings 包來完成對(duì)字符串的主要操作。

4.7.1 前綴和后綴

HasPrefix 判斷字符串 s 是否以 prefix 開頭:

strings.HasPrefix(s, prefix string) bool

HasSuffix 判斷字符串 s 是否以 suffix 結(jié)尾:

strings.HasSuffix(s, suffix string) bool

示例 4.13 presuffix.go

package main

import (
    "fmt"
    "strings"
)

func main() {
    var str string = "This is an example of a string"
    fmt.Printf("T/F? Does the string \"%s\" have prefix %s? ", str, "Th")
    fmt.Printf("%t\n", strings.HasPrefix(str, "Th"))
}

輸出:

T/F? Does the string "This is an example of a string" have prefix Th? true

這個(gè)例子同樣演示了轉(zhuǎn)義字符 \ 和格式化字符串的使用。

4.7.2 字符串包含關(guān)系

Contains 判斷字符串 s 是否包含 substr

strings.Contains(s, substr string) bool

4.7.3 判斷子字符串或字符在父字符串中出現(xiàn)的位置(索引)

Index 返回字符串 str 在字符串 s 中的索引(str 的第一個(gè)字符的索引),-1 表示字符串 s 不包含字符串 str

strings.Index(s, str string) int

LastIndex 返回字符串 str 在字符串 s 中最后出現(xiàn)位置的索引(str 的第一個(gè)字符的索引),-1 表示字符串 s 不包含字符串 str

strings.LastIndex(s, str string) int

如果 ch 是非 ASCII 編碼的字符,建議使用以下函數(shù)來對(duì)字符進(jìn)行定位:

strings.IndexRune(s string, r rune) int

示例 4.14 index_in_string.go

package main

import (
    "fmt"
    "strings"
)

func main() {
    var str string = "Hi, I'm Marc, Hi."

    fmt.Printf("The position of \"Marc\" is: ")
    fmt.Printf("%d\n", strings.Index(str, "Marc"))

    fmt.Printf("The position of the first instance of \"Hi\" is: ")
    fmt.Printf("%d\n", strings.Index(str, "Hi"))
    fmt.Printf("The position of the last instance of \"Hi\" is: ")
    fmt.Printf("%d\n", strings.LastIndex(str, "Hi"))

    fmt.Printf("The position of \"Burger\" is: ")
    fmt.Printf("%d\n", strings.Index(str, "Burger"))
}

輸出:

The position of "Marc" is: 8
The position of the first instance of "Hi" is: 0
The position of the last instance of "Hi" is: 14
The position of "Burger" is: -1

4.7.4 字符串替換

Replace 用于將字符串 str 中的前 n 個(gè)字符串 old 替換為字符串 new,并返回一個(gè)新的字符串,如果 n = -1 則替換所有字符串 old 為字符串 new

strings.Replace(str, old, new, n) string

4.7.5 統(tǒng)計(jì)字符串出現(xiàn)次數(shù)

Count 用于計(jì)算字符串 str 在字符串 s 中出現(xiàn)的非重疊次數(shù):

strings.Count(s, str string) int

示例 4.15 count_substring.go

package main

import (
    "fmt"
    "strings"
)

func main() {
    var str string = "Hello, how is it going, Hugo?"
    var manyG = "gggggggggg"

    fmt.Printf("Number of H's in %s is: ", str)
    fmt.Printf("%d\n", strings.Count(str, "H"))

    fmt.Printf("Number of double g's in %s is: ", manyG)
    fmt.Printf("%d\n", strings.Count(manyG, "gg"))
}

輸出:

Number of H's in Hello, how is it going, Hugo? is: 2
Number of double g’s in gggggggggg is: 5

4.7.6 重復(fù)字符串

Repeat 用于重復(fù) count 次字符串 s 并返回一個(gè)新的字符串:

strings.Repeat(s, count int) string

示例 4.16 repeat_string.go

package main

import (
    "fmt"
    "strings"
)

func main() {
    var origS string = "Hi there! "
    var newS string

    newS = strings.Repeat(origS, 3)
    fmt.Printf("The new repeated string is: %s\n", newS)
}

輸出:

The new repeated string is: Hi there! Hi there! Hi there!

4.7.7 修改字符串大小寫

ToLower 將字符串中的 Unicode 字符全部轉(zhuǎn)換為相應(yīng)的小寫字符:

strings.ToLower(s) string

ToUpper 將字符串中的 Unicode 字符全部轉(zhuǎn)換為相應(yīng)的大寫字符:

strings.ToUpper(s) string

示例 4.17 toupper_lower.go

package main

import (
    "fmt"
    "strings"
)

func main() {
    var orig string = "Hey, how are you George?"
    var lower string
    var upper string

    fmt.Printf("The original string is: %s\n", orig)
    lower = strings.ToLower(orig)
    fmt.Printf("The lowercase string is: %s\n", lower)
    upper = strings.ToUpper(orig)
    fmt.Printf("The uppercase string is: %s\n", upper)
}

輸出:

The original string is: Hey, how are you George?
The lowercase string is: hey, how are you george?
The uppercase string is: HEY, HOW ARE YOU GEORGE?

4.7.8 修剪字符串

你可以使用 strings.TrimSpace(s) 來剔除字符串開頭和結(jié)尾的空白符號(hào);如果你想要剔除指定字符,則可以使用 strings.Trim(s, "cut") 來將開頭和結(jié)尾的 cut 去除掉。該函數(shù)的第二個(gè)參數(shù)可以包含任何字符,如果你只想剔除開頭或者結(jié)尾的字符串,則可以使用 TrimLeft 或者 TrimRight 來實(shí)現(xiàn)。

4.7.9 分割字符串

strings.Fields(s) 將會(huì)利用 1 個(gè)或多個(gè)空白符號(hào)來作為動(dòng)態(tài)長(zhǎng)度的分隔符將字符串分割成若干小塊,并返回一個(gè) slice,如果字符串只包含空白符號(hào),則返回一個(gè)長(zhǎng)度為 0 的 slice。

strings.Split(s, sep) 用于自定義分割符號(hào)來對(duì)指定字符串進(jìn)行分割,同樣返回 slice。

因?yàn)檫@ 2 個(gè)函數(shù)都會(huì)返回 slice,所以習(xí)慣使用 for-range 循環(huán)來對(duì)其進(jìn)行處理(第 7.3 節(jié))。

4.7.10 拼接 slice 到字符串

Join 用于將元素類型為 string 的 slice 使用分割符號(hào)來拼接組成一個(gè)字符串:

strings.Join(sl []string, sep string) string

示例 4.18 strings_splitjoin.go

package main

import (
    "fmt"
    "strings"
)

func main() {
    str := "The quick brown fox jumps over the lazy dog"
    sl := strings.Fields(str)
    fmt.Printf("Splitted in slice: %v\n", sl)
    for _, val := range sl {
        fmt.Printf("%s - ", val)
    }
    fmt.Println()
    str2 := "GO1|The ABC of Go|25"
    sl2 := strings.Split(str2, "|")
    fmt.Printf("Splitted in slice: %v\n", sl2)
    for _, val := range sl2 {
        fmt.Printf("%s - ", val)
    }
    fmt.Println()
    str3 := strings.Join(sl2,";")
    fmt.Printf("sl2 joined by ;: %s\n", str3)
}

輸出:

Splitted in slice: [The quick brown fox jumps over the lazy dog]
The - quick - brown - fox - jumps - over - the - lazy - dog -
Splitted in slice: [GO1 The ABC of Go 25]
GO1 - The ABC of Go - 25 -
sl2 joined by ;: GO1;The ABC of Go;25

其它有關(guān)字符串操作的文檔請(qǐng)參閱 官方文檔譯者注:國(guó)內(nèi)用戶可訪問 該頁(yè)面 )。

4.7.11 從字符串中讀取內(nèi)容

函數(shù) strings.NewReader(str) 用于生成一個(gè) Reader 并讀取字符串中的內(nèi)容,然后返回指向該 Reader 的指針,從其它類型讀取內(nèi)容的函數(shù)還有:

  • Read() 從 []byte 中讀取內(nèi)容。
  • ReadByte()ReadRune() 從字符串中讀取下一個(gè) byte 或者 rune。

4.7.12 字符串與其它類型的轉(zhuǎn)換

與字符串相關(guān)的類型轉(zhuǎn)換都是通過 strconv 包實(shí)現(xiàn)的。

該包包含了一些變量用于獲取程序運(yùn)行的操作系統(tǒng)平臺(tái)下 int 類型所占的位數(shù),如:strconv.IntSize。

任何類型 T 轉(zhuǎn)換為字符串總是成功的。

針對(duì)從數(shù)字類型轉(zhuǎn)換到字符串,Go 提供了以下函數(shù):

  • strconv.Itoa(i int) string 返回?cái)?shù)字 i 所表示的字符串類型的十進(jìn)制數(shù)。
  • strconv.FormatFloat(f float64, fmt byte, prec int, bitSize int) string 將 64 位浮點(diǎn)型的數(shù)字轉(zhuǎn)換為字符串,其中 fmt 表示格式(其值可以是 'b''e'、'f''g'),prec 表示精度,bitSize 則使用 32 表示 float32,用 64 表示 float64。

將字符串轉(zhuǎn)換為其它類型 tp 并不總是可能的,可能會(huì)在運(yùn)行時(shí)拋出錯(cuò)誤 parsing "…": invalid argument。

針對(duì)從字符串類型轉(zhuǎn)換為數(shù)字類型,Go 提供了以下函數(shù):

  • strconv.Atoi(s string) (i int, err error) 將字符串轉(zhuǎn)換為 int 型。
  • strconv.ParseFloat(s string, bitSize int) (f float64, err error) 將字符串轉(zhuǎn)換為 float64 型。

利用多返回值的特性,這些函數(shù)會(huì)返回 2 個(gè)值,第 1 個(gè)是轉(zhuǎn)換后的結(jié)果(如果轉(zhuǎn)換成功),第 2 個(gè)是可能出現(xiàn)的錯(cuò)誤,因此,我們一般使用以下形式來進(jìn)行從字符串到其它類型的轉(zhuǎn)換:

val, err = strconv.Atoi(s)

在下面這個(gè)示例中,我們忽略可能出現(xiàn)的轉(zhuǎn)換錯(cuò)誤:

示例 4.19 string_conversion.go

package main

import (
    "fmt"
    "strconv"
)

func main() {
    var orig string = "666"
    var an int
    var newS string

    fmt.Printf("The size of ints is: %d\n", strconv.IntSize)      

    an, _ = strconv.Atoi(orig)
    fmt.Printf("The integer is: %d\n", an) 
    an = an + 5
    newS = strconv.Itoa(an)
    fmt.Printf("The new string is: %s\n", newS)
}

輸出:

64 位系統(tǒng):
The size of ints is: 64
32 位系統(tǒng):
The size of ints is: 32
The integer is: 666
The new string is: 671

在第 5.1 節(jié),我們將會(huì)利用 if 語(yǔ)句來對(duì)可能出現(xiàn)的錯(cuò)誤進(jìn)行分類處理。

更多有關(guān)該包的討論,請(qǐng)參閱 官方文檔譯者注:國(guó)內(nèi)用戶可訪問 該頁(yè)面 )。

鏈接