Go語言字符串及strings和strconv包使用實(shí)例
前言
在 Go 語言編程中,字符串是最基本、最常用的數(shù)據(jù)類型之一。無論是處理用戶輸入、讀取文件內(nèi)容,還是生成輸出,字符串操作無處不在。為了方便開發(fā)者對(duì)字符串進(jìn)行各種操作,Go 語言提供了強(qiáng)大的 strings
包和 strconv
包。strings
包包含了一系列函數(shù),用于處理和操作字符串,如查找、替換、分割、拼接等。strconv
包則專注于字符串與其他基本數(shù)據(jù)類型之間的轉(zhuǎn)換,使得數(shù)據(jù)處理更加簡潔高效。在這篇文章中,我們將深入探討 Go 語言中的字符串處理方法,并詳細(xì)介紹 strings
包和 strconv
包的主要功能和用法,幫助您更好地掌握字符串操作技巧,提高編程效率。
1、Go 語言中的字符串
1.1、GO 語言
在 Go 語言中,字符串是 UTF-8 編碼字符的序列。對(duì)于 ASCII 字符,每個(gè)字符占用 1 個(gè)字節(jié),而其他字符根據(jù)需要占用 2 至 4 個(gè)字節(jié)。UTF-8 是一種廣泛使用的編碼格式,許多標(biāo)準(zhǔn)文本文件(如 XML 和 JSON)都采用這種編碼。由于 UTF-8 編碼的可變長度特性,Go 語言中的字符串也可能占用 1 到 4 個(gè)字節(jié),這與 C++、Java 或 Python 不同(例如,Java 始終使用 2 個(gè)字節(jié))。這種設(shè)計(jì)不僅減少了內(nèi)存和硬盤空間的占用,還免去了對(duì) UTF-8 文本進(jìn)行編碼和解碼的繁瑣操作。
字符串在 Go 中是一種值類型,且值不可變。這意味著一旦創(chuàng)建了字符串,就不能修改其內(nèi)容。更深入地講,字符串是字節(jié)的定長數(shù)組。
1.2、字符串字面值
Go 支持兩種形式的字符串字面值:
解釋字符串(Interpreted Strings):
- 使用雙引號(hào)括起來。
- 轉(zhuǎn)義字符會(huì)被替換,例如:
\n
表示換行符,\t
表示制表符,\u
或\U
表示 Unicode 字符,\\
表示反斜杠本身。
示例:
var str = "Hello, World!\n"
非解釋字符串(Raw Strings):
- 使用反引號(hào)括起來。
- 支持多行字符串,轉(zhuǎn)義字符不會(huì)被替換,所有內(nèi)容都會(huì)原樣輸出。
示例:
var rawStr = `This is a raw string \n`
在 Go 中,字符串是通過長度來限定的,而不是像 C/C++ 那樣通過特殊字符 \0
結(jié)束。string
類型的零值是長度為零的字符串,即空字符串 ""
。
1.3、字符串比較和操作
字符串可以通過常見的比較運(yùn)算符(==
、!=
、<
、<=
、>=
、>
)按字節(jié)在內(nèi)存中進(jìn)行比較。可以使用 len()
函數(shù)獲取字符串的字節(jié)長度:
len("hello") // 5
字符串的內(nèi)容(字節(jié))可以通過索引訪問,索引從 0 開始:
var str = "hello" str[0] // 'h' str[len(str)-1] // 'o'
需要注意的是,這種索引方式只對(duì)純 ASCII 字符串有效。對(duì)于 Unicode 字符,需要使用 unicode/utf8
包提供的方法。
1.4、字符串拼接
字符串可以使用 +
運(yùn)算符拼接:
var s1 = "hello" var s2 = "world" var s = s1 + " " + s2 // "hello world"
也可以使用 +=
運(yùn)算符進(jìn)行拼接:
var s = "hello" s += ", " s += "world!" // "hello, world!"
在循環(huán)中使用 +
進(jìn)行字符串拼接并不是最高效的方法。更好的方法是使用 strings.Join()
函數(shù),或者使用 bytes.Buffer
進(jìn)行高效的字符串拼接。
1.5、字符串的其他操作
在 Go 語言中,可以將字符串視為字節(jié)(byte
)的切片(slice
),從而實(shí)現(xiàn)標(biāo)準(zhǔn)索引操作。使用 for
循環(huán)可以根據(jù)索引返回字符串中的字節(jié)。而使用 for-range
循環(huán)可以對(duì) Unicode 字符串進(jìn)行迭代操作。
此外,Go 語言提供了豐富的字符串操作函數(shù)和方法,可以在標(biāo)準(zhǔn)庫的 strings
和 unicode/utf8
包中找到。例如,可以使用 fmt.Sprint(x)
來格式化生成并返回字符串。
1.6、示例:統(tǒng)計(jì)字節(jié)和字符
創(chuàng)建一個(gè)程序用于統(tǒng)計(jì)字符串中的字節(jié)和字符數(shù)量。例如,分析字符串 "asSASA ddd dsjkdsjs dk"
和 "asSASA ddd dsjkdsjsこん dk"
,并解釋兩者不同的原因(提示:使用 unicode/utf8
包)。
示例代碼:
package main import ( "fmt" "unicode/utf8" ) func main() { str1 := "asSASA ddd dsjkdsjs dk" str2 := "asSASA ddd dsjkdsjsこん dk" fmt.Printf("String: %s\n", str1) fmt.Printf("Bytes: %d, Runes: %d\n", len(str1), utf8.RuneCountInString(str1)) fmt.Printf("String: %s\n", str2) fmt.Printf("Bytes: %d, Runes: %d\n", len(str2), utf8.RuneCountInString(str2)) }
該程序統(tǒng)計(jì)并輸出字符串的字節(jié)數(shù)和字符(rune)數(shù),從而展示 UTF-8 編碼在處理不同字符時(shí)的差異。
2、strings 和 strconv 包
在 Go 語言中,字符串作為一種基本數(shù)據(jù)結(jié)構(gòu),有許多預(yù)定義的處理函數(shù)。strings
包用于對(duì)字符串進(jìn)行主要操作,而 strconv
包用于字符串與其他類型之間的轉(zhuǎn)換。
2.1、strings 包
strings
包提供了豐富的字符串操作函數(shù),以下是一些常用操作:
2.1.1、前綴和后綴
strings.HasPrefix(s, prefix string) bool
:判斷字符串s
是否以prefix
開頭。strings.HasSuffix(s, suffix string) bool
:判斷字符串s
是否以suffix
結(jié)尾。
示例:
package main import ( "fmt" "strings" ) func main() { str := "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
2.1.2、字符串包含關(guān)系
strings.Contains(s, substr string) bool
:判斷字符串s
是否包含子字符串substr
。
2.1.3、判斷子字符串或字符在父字符串中出現(xiàn)的位置(索引)
strings.Index(s, str string) int
:返回子字符串str
在字符串s
中的第一個(gè)出現(xiàn)位置的索引,-1 表示不包含。strings.LastIndex(s, str string) int
:返回子字符串str
在字符串s
中最后一次出現(xiàn)位置的索引,-1 表示不包含。strings.IndexRune(s string, r rune) int
:返回字符r
在字符串s
中的索引。
示例:
package main import ( "fmt" "strings" ) func main() { str := "Hi, I'm Marc, Hi." fmt.Printf("The position of \"Marc\" is: %d\n", strings.Index(str, "Marc")) fmt.Printf("The position of the first instance of \"Hi\" is: %d\n", strings.Index(str, "Hi")) fmt.Printf("The position of the last instance of \"Hi\" is: %d\n", strings.LastIndex(str, "Hi")) fmt.Printf("The position of \"Burger\" is: %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
2.1.4、字符串替換
strings.Replace(str, old, new string, n int) string
:將字符串str
中的前n
個(gè)字符串old
替換為字符串new
,并返回一個(gè)新的字符串。如果n = -1
,則替換所有字符串old
。
2.1.5、統(tǒng)計(jì)字符串出現(xiàn)次數(shù)
strings.Count(s, str string) int
:計(jì)算字符串str
在字符串s
中出現(xiàn)的非重疊次數(shù)。
示例:
package main import ( "fmt" "strings" ) func main() { str := "Hello, how is it going, Hugo?" manyG := "gggggggggg" fmt.Printf("Number of H's in %s is: %d\n", str, strings.Count(str, "H")) fmt.Printf("Number of double g's in %s is: %d\n", manyG, 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
2.1.6、重復(fù)字符串
strings.Repeat(s, count int) string
:返回一個(gè)新的字符串,該字符串由count
次重復(fù)字符串s
組成。
示例:
package main import ( "fmt" "strings" ) func main() { origS := "Hi there! " 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!
2.1.7、修改字符串大小寫
strings.ToLower(s) string
:將字符串s
中的所有 Unicode 字符轉(zhuǎn)換為小寫。strings.ToUpper(s) string
:將字符串s
中的所有 Unicode 字符轉(zhuǎn)換為大寫。
示例:
package main import ( "fmt" "strings" ) func main() { orig := "Hey, how are you George?" fmt.Printf("The original string is: %s\n", orig) fmt.Printf("The lowercase string is: %s\n", strings.ToLower(orig)) fmt.Printf("The uppercase string is: %s\n", strings.ToUpper(orig)) }
輸出:
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?
2.1.8、修剪字符串
strings.TrimSpace(s)
:剔除字符串開頭和結(jié)尾的空白符號(hào)。strings.Trim(s, cutset)
:剔除字符串開頭和結(jié)尾的指定字符cutset
。strings.TrimLeft(s, cutset)
:剔除字符串開頭的指定字符cutset
。strings.TrimRight(s, cutset)
:剔除字符串結(jié)尾的指定字符cutset
。
2.1.9、分割字符串
strings.Fields(s)
:根據(jù)空白符分割字符串,返回一個(gè)字符串切片。strings.Split(s, sep)
:根據(jù)指定的分隔符sep
分割字符串,返回一個(gè)字符串切片。
示例:
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
2.1.10、拼接 slice 到字符串
strings.Join(sl []string, sep string) string
:將元素類型為string
的 slice 使用分割符sep
拼接成一個(gè)字符串。
2.1.11、從字符串中讀取內(nèi)容
strings.NewReader(str)
:生成一個(gè) Reader 并讀取字符串中的內(nèi)容,然后返回指向該 Reader 的指針。
示例:
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
更多字符串操作的文檔請(qǐng)參閱官方文檔。
2.2、strconv 包
strconv
包用于字符串與其他基本數(shù)據(jù)類型之間的轉(zhuǎn)換。
2.2.1、將其他類型轉(zhuǎn)換為字符串
strconv.Itoa(i int) string
:將整數(shù)轉(zhuǎn)換為字符串。strconv.FormatFloat(f float64, fmt byte, prec int, bitSize int) string
:將浮點(diǎn)數(shù)轉(zhuǎn)換為字符串,fmt
表示格式,prec
表示精度,bitSize
用于區(qū)分float32
和float64
。
示例:
package main import ( "fmt" "strconv" ) func main() { var i int = 123 var f float64 = 3.14159 s1 := strconv.Itoa(i) s2 := strconv.FormatFloat(f, 'f', -1, 64) fmt.Printf("Integer to string: %s\n", s1) fmt.Printf("Float to string: %s\n", s2) }
輸出:
Integer to string: 123
Float to string: 3.14159
2.2.2、將字符串轉(zhuǎn)換為其他類型
strconv.Atoi(s string) (int, error)
:將字符串轉(zhuǎn)換為整數(shù)。strconv.ParseFloat(s string, bitSize int) (float64, error)
:將字符串轉(zhuǎn)換為浮點(diǎn)數(shù)。
示例:
package main import ( "fmt" "strconv" ) func main() { var str string = "666" var anInt int var newStr string anInt, _ = strconv.Atoi(str) fmt.Printf("The integer is: %d\n", anInt) anInt += 5 newStr = strconv.Itoa(anInt) fmt.Printf("The new string is: %s\n", newStr) }
輸出:
The integer is: 666
The new string is: 671
strconv
包中還包含了一些輔助變量,如 strconv.IntSize
,用于獲取當(dāng)前平臺(tái)下 int
類型的大小(位數(shù))。
通過 strings
和 strconv
包的強(qiáng)大功能,Go 語言提供了豐富的字符串處理和轉(zhuǎn)換工具,使得開發(fā)者能夠高效地處理和轉(zhuǎn)換字符串?dāng)?shù)據(jù)。
附:go語言中在數(shù)字中讀取小數(shù)點(diǎn)在數(shù)字字符串的哪一位
在 Go 語言中,可以使用 strconv 包中的 ParseFloat 函數(shù)將字符串轉(zhuǎn)換為數(shù)字,并讀取小數(shù)點(diǎn)在字符串的哪一位。具體的使用方法如下:
import "strconv" str := "123.456789" num, _ := strconv.ParseFloat(str, 64) // 將[字符串](https://geek.csdn.net/educolumn/ba94496e6cfa8630df5d047358ad9719?dp_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6NDQ0MDg2MiwiZXhwIjoxNzA3MzcxOTM4LCJpYXQiOjE3MDY3NjcxMzgsInVzZXJuYW1lIjoid2VpeGluXzY4NjQ1NjQ1In0.RrTYEnMNYPC7AQdoij4SBb0kKEgHoyvF-bZOG2eGQvc&spm=1055.2569.3001.10083)轉(zhuǎn)換為 float64 類型的數(shù)字 dotIndex := strings.Index(strconv.FormatFloat(num, 'f', -1, 64), ".") // 讀取小數(shù)點(diǎn)在[字符串](https://geek.csdn.net/educolumn/ba94496e6cfa8630df5d047358ad9719?dp_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6NDQ0MDg2MiwiZXhwIjoxNzA3MzcxOTM4LCJpYXQiOjE3MDY3NjcxMzgsInVzZXJuYW1lIjoid2VpeGluXzY4NjQ1NjQ1In0.RrTYEnMNYPC7AQdoij4SBb0kKEgHoyvF-bZOG2eGQvc&spm=1055.2569.3001.10083)中的位置 fmt.Println(dotIndex) // 輸出為 3
在 ParseFloat 函數(shù)中,第一個(gè)參數(shù)表示需要轉(zhuǎn)換為數(shù)字的字符串,第二個(gè)參數(shù)表示使用 float64 類型進(jìn)行轉(zhuǎn)換。在上面的例子中,我們將字符串轉(zhuǎn)換為數(shù)字后,使用 FormatFloat 函數(shù)讀取小數(shù)點(diǎn)在字符串中的位置。在 FormatFloat 函數(shù)中,'f' 表示格式化為浮點(diǎn)數(shù),-1 表示不限制小數(shù)位數(shù),64 表示使用 float64 類型的數(shù)字進(jìn)行格式化。然后使用 strings 包中的 Index 函數(shù)讀取小數(shù)點(diǎn)在字符串中的位置。
總結(jié)
到此這篇關(guān)于Go語言字符串及strings和strconv包使用的文章就介紹到這了,更多相關(guān)Go字符串strings和strconv包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang創(chuàng)建構(gòu)造函數(shù)的方法超詳細(xì)講解
構(gòu)造器一般面向?qū)ο笳Z言的典型特性,用于初始化變量。Go語言沒有任何具體構(gòu)造器,但我們能使用該特性去初始化變量。本文介紹不同類型構(gòu)造器的差異及其應(yīng)用場景2023-01-01Go高級(jí)特性探究之優(yōu)先級(jí)隊(duì)列詳解
Heap?是一種數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)常用于實(shí)現(xiàn)優(yōu)先隊(duì)列,這篇文章主要就是來和大家深入探討一下GO語言中的優(yōu)先級(jí)隊(duì)列,感興趣的可以了解一下2023-06-06golang基于Mutex實(shí)現(xiàn)可重入鎖
鎖可重入也就是當(dāng)前已經(jīng)獲取到鎖的goroutine繼續(xù)調(diào)用Lock方法獲取鎖,Go標(biāo)準(zhǔn)庫中提供了sync.Mutex實(shí)現(xiàn)了排他鎖,但并不是可重入的,所以本文給大家介紹了golang基于Mutex實(shí)現(xiàn)可重入鎖,文中有詳細(xì)的代碼示例,需要的朋友可以參考下2024-03-03go語言中的udp協(xié)議及TCP通訊實(shí)現(xiàn)示例
這篇文章主要為大家介紹了go語言中的udp協(xié)議及TCP通訊的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04Golang實(shí)現(xiàn)yaml配置文件的解析
這篇文章主要介紹了Golang實(shí)現(xiàn)yaml配置文件的解析,文中通過圖文結(jié)合的方式講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-12-12GO web 數(shù)據(jù)庫預(yù)處理的實(shí)現(xiàn)
本文主要介紹了GO web 數(shù)據(jù)庫預(yù)處理的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10