Go strconv包實(shí)現(xiàn)字符串和基本數(shù)據(jù)類(lèi)型轉(zhuǎn)換的實(shí)例詳解
在Go語(yǔ)言(Golang)的編程實(shí)踐中,strconv包是一個(gè)非常重要的標(biāo)準(zhǔn)庫(kù),它提供了在基本數(shù)據(jù)類(lèi)型(如整型、浮點(diǎn)型、布爾型)和字符串之間的轉(zhuǎn)換功能。
無(wú)論是在處理用戶輸入、文件讀寫(xiě)、網(wǎng)絡(luò)傳輸還是其他需要數(shù)據(jù)格式轉(zhuǎn)換的場(chǎng)景中,strconv包都扮演著至關(guān)重要的角色。
1. strconv包概述
strconv是兩個(gè)單詞的縮寫(xiě)。string convert = strconv
strconv包位于Go語(yǔ)言的標(biāo)準(zhǔn)庫(kù)中,它提供了一系列用于字符串和基本數(shù)據(jù)類(lèi)型之間轉(zhuǎn)換的函數(shù)。這些函數(shù)主要包括以下幾種類(lèi)型:
將基本數(shù)據(jù)類(lèi)型轉(zhuǎn)換為字符串的函數(shù),如Itoa、FormatInt、FormatFloat、FormatBool等。
將字符串解析為基本數(shù)據(jù)類(lèi)型的函數(shù),如Atoi、ParseInt、ParseFloat、ParseBool等。
附加到已存在字節(jié)數(shù)組的函數(shù),如AppendInt、AppendFloat、AppendBool等。
其他輔助函數(shù),如IsPrint、IsGraphic、Quote、Unquote等。
將字符串轉(zhuǎn)換為其他基礎(chǔ)類(lèi)型的過(guò)程叫做解析parse,其他基礎(chǔ)類(lèi)型轉(zhuǎn)換為字符串的過(guò)程成為格式化format
2. 整數(shù)與字符串的轉(zhuǎn)換
2.1 整數(shù)轉(zhuǎn)字符串
在Go語(yǔ)言中,將整數(shù)轉(zhuǎn)換為字符串是一個(gè)常見(jiàn)的需求。strconv包中的Itoa函數(shù)和FormatInt函數(shù)都可以實(shí)現(xiàn)這一功能。
示例1:使用Itoa函數(shù)
package main import ( "fmt" "strconv" ) //整形轉(zhuǎn)字符串 func main() { intNum := 42 //整形轉(zhuǎn)字符串方法strconv.Itoa strFromInt := strconv.Itoa(intNum) fmt.Printf("整型轉(zhuǎn)換為字符串: %s\n", strFromInt) fmt.Printf("整型轉(zhuǎn)換為字符串?dāng)?shù)據(jù)類(lèi)型: %T\n", strFromInt) }
在這個(gè)例子中,Itoa函數(shù)將整數(shù)42轉(zhuǎn)換為字符串"42"。
示例2:使用FormatInt函數(shù)
對(duì)于大整數(shù)或需要指定進(jìn)制的無(wú)符號(hào)整數(shù)場(chǎng)景,可以使用FormatInt函數(shù)。
func FormatInt(i int64, base int) string
i 表示需要轉(zhuǎn)換的整數(shù),base 表示源數(shù)字要轉(zhuǎn)換后的進(jìn)制數(shù),最終返回的是 i 的字符串形式
package main import ( "fmt" "strconv" ) func main() { bigIntValue := int64(9223372036854775807) // MaxInt64 bigIntStr := strconv.FormatInt(bigIntValue, 10) fmt.Println("大整數(shù)轉(zhuǎn)字符串:", bigIntStr) // 轉(zhuǎn)換為二進(jìn)制字符串 binaryStr := strconv.FormatInt(bigIntValue, 2) fmt.Println("大整數(shù)轉(zhuǎn)二進(jìn)制字符串:", binaryStr) }
2.2 字符串轉(zhuǎn)整數(shù)
將字符串轉(zhuǎn)換為整數(shù),可以使用Atoi函數(shù)或ParseInt函數(shù)。
示例1:使用Atoi函數(shù)
注意,字符串轉(zhuǎn)整形,需要進(jìn)行錯(cuò)誤捕獲
func Atoi(s string) (int, error)
package main import ( "fmt" "strconv" ) func main() { str := "123" intFromStr, err := strconv.Atoi(str) if err != nil { fmt.Println("轉(zhuǎn)換錯(cuò)誤:", err) return } fmt.Printf("字符串轉(zhuǎn)換為整型: %d\n", intFromStr) }
Atoi函數(shù)將字符串轉(zhuǎn)換為int類(lèi)型。注意,如果字符串不能被解析為整數(shù),Atoi會(huì)返回錯(cuò)誤。
示例2:使用ParseInt函數(shù)
ParseInt函數(shù)比Atoi更靈活,允許指定基數(shù)(進(jìn)制)和位大小。
func ParseInt(s string, base int, bitSize int) (i int64, err error)
s string表示需要轉(zhuǎn)換的字符串
base int 表示需要轉(zhuǎn)換的數(shù)據(jù)的進(jìn)制
bitSize int 表示轉(zhuǎn)換后的整數(shù)為多少位int類(lèi)型
返回一個(gè)int64整形和一個(gè)error
package main import ( "fmt" "strconv" ) func main() { hexStr := "FF" hexValue, err := strconv.ParseInt(hexStr, 16, 64) if err != nil { fmt.Println("轉(zhuǎn)換錯(cuò)誤:", err) return } fmt.Printf("十六進(jìn)制字符串轉(zhuǎn)整數(shù): %d\n", hexValue) }
3. 浮點(diǎn)數(shù)與字符串的轉(zhuǎn)換
3.1 浮點(diǎn)數(shù)轉(zhuǎn)字符串
將浮點(diǎn)數(shù)轉(zhuǎn)換為字符串,可以使用FormatFloat函數(shù)。
func FormatFloat(f float64, fmt byte, prec, bitSize int) string
f:要格式化的浮點(diǎn)數(shù)
fmt:格式標(biāo)記,'b’表示二進(jìn)制,'e’表示科學(xué)計(jì)數(shù)法,'f’表示十進(jìn)制無(wú)指數(shù),'g’表示最少計(jì)數(shù)法表示
prec:表示精度,對(duì)于’f’和’g’格式,代表除小數(shù)點(diǎn)以外的位數(shù)。也可以是-1,表示根據(jù)浮點(diǎn)數(shù)的小數(shù)位數(shù)自動(dòng)確定保留的位數(shù)。
bitsize:浮點(diǎn)數(shù)類(lèi)型,32表示float32,64表示float64
示例
package main import ( "fmt" "strconv" ) func main() { floatValue := 3.14159 floatStr := strconv.FormatFloat(floatValue, 'f', -1, 64) fmt.Println("浮點(diǎn)數(shù)轉(zhuǎn)字符串:", floatStr) // 保留兩位小數(shù) preciseFloatStr := strconv.FormatFloat(floatValue, 'f', 2, 64) fmt.Println("精確到兩位小數(shù)的浮點(diǎn)數(shù)轉(zhuǎn)字符串:", preciseFloatStr) }
3.2 字符串轉(zhuǎn)浮點(diǎn)數(shù)
將字符串轉(zhuǎn)換為浮點(diǎn)數(shù),可以使用ParseFloat函數(shù)。
func ParseFloat(s string, bitSize int) (float64, error)
將字符串解析為浮點(diǎn)數(shù),如果 s 符合語(yǔ)法規(guī)則,會(huì)返回一個(gè)最為接近 s 表示值得浮點(diǎn)數(shù)(IEEE754 規(guī)范舍入)
bitSize 指定解析結(jié)果的浮點(diǎn)數(shù)類(lèi)型,32 是 float32,64 是 float64
返回值 err 是 *NumErr 類(lèi)型的,語(yǔ)法有誤時(shí),err.Error = ErrSyntax;結(jié)果超出表示范圍時(shí),返回值 f 為 ±Inf,err.Error= ErrRange
示例
package main import ( "fmt" "strconv" ) func main() { str := "3.14" floatValue, err := strconv.ParseFloat(str, 64) if err != nil { fmt.Println("轉(zhuǎn)換錯(cuò)誤:", err) return } fmt.Println("字符串轉(zhuǎn)浮點(diǎn)數(shù):", floatValue) }
4. 布爾值與字符串的轉(zhuǎn)換
4.1 布爾值轉(zhuǎn)字符串
將布爾值轉(zhuǎn)換為字符串時(shí),可以使用strconv.FormatBool函數(shù)。該函數(shù)將true轉(zhuǎn)換為字符串"true",將false轉(zhuǎn)換為字符串"false"。
示例
package main import ( "fmt" "strconv" ) func main() { boolValue := true boolStr := strconv.FormatBool(boolValue) fmt.Println("布爾值轉(zhuǎn)字符串:", boolStr) fmt.Printf("布爾值轉(zhuǎn)字符串?dāng)?shù)據(jù)類(lèi)型:%T\n", boolStr) }
4.2 字符串轉(zhuǎn)布爾值
將字符串轉(zhuǎn)換為布爾值時(shí),可以使用strconv.ParseBool函數(shù)。
該函數(shù)會(huì)嘗試將字符串解析為布爾值,并返回解析后的布爾值和可能發(fā)生的錯(cuò)誤。有效的布爾值字符串為"true"和"false"(不區(qū)分大小寫(xiě))。
示例代碼:
package main import ( "fmt" "strconv" ) func main() { //字符串轉(zhuǎn)換為布爾值,里面的布爾值不區(qū)分大小寫(xiě) str := "true" boolValue, err := strconv.ParseBool(str) if err != nil { panic(err) } fmt.Println("字符串轉(zhuǎn)布爾值:", boolValue) fmt.Printf("字符串轉(zhuǎn)布爾值數(shù)據(jù)類(lèi)型:%T\n", boolValue) }
5. strconv包的其他功能
5.1 Append系列函數(shù)
strconv包還提供了Append…系列函數(shù),這些函數(shù)可以將基本數(shù)據(jù)類(lèi)型追加到已存在的字節(jié)數(shù)組中,而無(wú)需重新分配整個(gè)數(shù)組。這在處理大量數(shù)據(jù)時(shí)非常有用,可以顯著提高性能。
package main import ( "fmt" "strconv" ) func main() { // 追加整數(shù)到字節(jié)數(shù)組 num1 := 123 byteSlice := []byte("Number: ") byteSlice = strconv.AppendInt(byteSlice, int64(num1), 10) fmt.Println("追加整數(shù):", string(byteSlice)) // 追加布爾值到字節(jié)數(shù)組 boolVal := true byteSlice = []byte("Bool: ") byteSlice = strconv.AppendBool(byteSlice, boolVal) fmt.Println("追加布爾值:", string(byteSlice)) // 追加浮點(diǎn)數(shù)到字節(jié)數(shù)組 floatVal := 3.14 byteSlice = []byte("Float: ") byteSlice = strconv.AppendFloat(byteSlice, floatVal, 'f', -1, 64) fmt.Println("追加浮點(diǎn)數(shù):", string(byteSlice)) }
5.2 輔助函數(shù)
strconv包還包含一些輔助函數(shù),如IsPrint、IsGraphic、Quote和Unquote等,它們提供了額外的功能,如檢查字符的可打印性、將字符串轉(zhuǎn)換為帶引號(hào)和轉(zhuǎn)義字符的字符串字面值等。strconv.Quote
函數(shù)用于將字符串轉(zhuǎn)換為雙引號(hào)括起來(lái)的、轉(zhuǎn)義了特殊字符的Go字符串字面量。而 strconv.Unquote
函數(shù)則執(zhí)行相反的操作,即解析一個(gè)被雙引號(hào)括起來(lái)、可能包含轉(zhuǎn)義字符的字符串。
示例
package main import ( "fmt" "strconv" ) func main() { chars := []rune{'H', 'e', 'l', '\n', '?', 127} for _, char := range chars { fmt.Printf("Character: %c, IsPrint: %v\n", char, strconv.IsPrint(char)) fmt.Printf("Character: %c, IsGraphic: %v\n", char, strconv.IsGraphic(char)) } str := `路多辛的,"所思所想"!。` quoted := strconv.Quote(str) fmt.Println("Quoted: ", quoted) unquoted, err := strconv.Unquote(quoted) if err != nil { panic(err) } fmt.Println("Unquoted: ", unquoted) }
注意事項(xiàng)
在使用Parse…系列函數(shù)時(shí),一定要檢查返回的錯(cuò)誤值,以確保轉(zhuǎn)換成功。
對(duì)于大整數(shù)或無(wú)符號(hào)整數(shù),應(yīng)使用FormatInt和ParseInt函數(shù),并指定適當(dāng)?shù)幕鶖?shù)和位數(shù)。
在處理浮點(diǎn)數(shù)時(shí),注意精度和格式的控制。
strconv包中的函數(shù)主要用于基本類(lèi)型和字符串之間的轉(zhuǎn)換,對(duì)于復(fù)雜數(shù)據(jù)結(jié)構(gòu)的序列化和反序列化,應(yīng)考慮使用encoding/json、encoding/xml等包。
6. 總結(jié)
strconv包是Go語(yǔ)言中處理字符串和基本數(shù)據(jù)類(lèi)型轉(zhuǎn)換的重要工具。
通過(guò)本文,我們?cè)敿?xì)學(xué)習(xí)了strconv包中整數(shù)、浮點(diǎn)數(shù)、布爾值與字符串之間的轉(zhuǎn)換方法,以及進(jìn)制轉(zhuǎn)換、追加到字節(jié)數(shù)組、引號(hào)處理和字符可打印性判斷等高級(jí)功能。
這些功能在數(shù)據(jù)處理、網(wǎng)絡(luò)通信、日志記錄等多個(gè)方面都有廣泛應(yīng)用。
以上就是Go語(yǔ)言字符串轉(zhuǎn)換strconv的實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go字符串轉(zhuǎn)換strconv的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
node-exporter被檢測(cè)出來(lái)pprof調(diào)試信息泄露漏洞問(wèn)題
這篇文章主要介紹了node-exporter被檢測(cè)出來(lái)pprof調(diào)試信息泄露漏洞問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04一文總結(jié)Go語(yǔ)言切片核心知識(shí)點(diǎn)和坑
都說(shuō)Go的切片用起來(lái)絲滑得很,Java中的List怎么用,切片就怎么用,作為曾經(jīng)的Java選手,因?yàn)榍衅氖褂貌坏卯?dāng),喜提缺陷若干,本文就給大家總結(jié)一下Go語(yǔ)言切片核心知識(shí)點(diǎn)和坑,需要的朋友可以參考下2023-06-06深入淺出Go語(yǔ)言:手把手教你高效生成與解析JSON數(shù)據(jù)
本文將帶你一步步走進(jìn)Go語(yǔ)言的世界,教你如何高效生成與解析JSON數(shù)據(jù),無(wú)論你是初學(xué)者還是經(jīng)驗(yàn)豐富的開(kāi)發(fā)者,都能在本文中找到實(shí)用的技巧和靈感,本文內(nèi)容簡(jiǎn)潔明了,示例豐富,讓你在閱讀的過(guò)程中輕松掌握Go語(yǔ)言生成與解析JSON數(shù)據(jù)的技巧,需要的朋友可以參考下2024-02-02Golang開(kāi)發(fā)中如何解決共享變量問(wèn)題
Go提供了傳統(tǒng)通過(guò)共享變量,也就是共享內(nèi)存的方式來(lái)實(shí)現(xiàn)并發(fā)。這篇文章會(huì)介紹 Go提供的相關(guān)機(jī)制,對(duì)Golang共享變量相關(guān)知識(shí)感興趣的朋友一起看看吧2021-09-09go語(yǔ)言fasthttp使用實(shí)例小結(jié)
fasthttp?是一個(gè)使用?Go?語(yǔ)言開(kāi)發(fā)的?HTTP?包,主打高性能,針對(duì)?HTTP?請(qǐng)求響應(yīng)流程中的?hot?path?代碼進(jìn)行了優(yōu)化,下面我們就來(lái)介紹go語(yǔ)言fasthttp使用實(shí)例小結(jié),感興趣的朋友跟隨小編一起看看吧2024-03-03Golang中文件目錄操作的實(shí)現(xiàn)步驟詳解
在Golang中,文件目錄是指計(jì)算機(jī)文件系統(tǒng)中的文件夾或目錄。目錄是用于組織和存儲(chǔ)文件的一種方式,可以包含文件和其他子目錄,本文主要介紹了Golang中文件目錄操作的實(shí)現(xiàn)方法,需要的朋友可以參考下2023-05-05解決go mod私有倉(cāng)庫(kù)拉取的問(wèn)題
這篇文章主要介紹了解決go mod私有倉(cāng)庫(kù)拉取的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05