前言
上篇文章介紹了 strings 標準庫裏的一些常用的函數和方法,本文也是以 string 類型為中心,通過 strconv 標準庫,介紹其與其他基本數據類型相互轉換的函數。
strconv
strconv 包提供了 string 類型與其他基本數據類型之間轉換的函數,本文不會介紹其所有函數,如果想了解更多的小夥伴可以到 Go 包文檔 查看。
string 與 int 之間的轉換
Itoa:int 類型轉 string 類型
Itoa(i int) string
- 參數
i為待轉換的數字。 -
返回值為轉換之後的字符串。
import ( "fmt" "strconv" ) func main() { num := 16 str := strconv.Itoa(num) fmt.Printf("類型:%T,值:%s", str, str) // 類型:string,值:16 }
Atoi:string 類型轉 int 類型
Atoi(s string) (int, error)
- 函數的參數為待轉換的字符串
-
返回值有兩個,第一個是轉換之後的整形數字,第二個是錯誤描述。
import ( "fmt" "strconv" ) func main() { str := "666" num, err := strconv.Atoi(str) if err != nil { fmt.Println("err: ", err.Error()) return } fmt.Printf("類型:%T,值:%d", num, num) // 類型:int,值:666 }此函數與
Itoa函數相比,多了一個error返回值,是因為如果是傳入的字符串無法轉成數字,例如1a1,此函數就會返回NumError錯誤,而Itoa函數,無論傳入的是什麼樣的數字,都可以轉為string,因此在轉換的過程中沒有error的説法。
FormatInt:將數字轉成指定進制數並以 string 類型返回
FormatInt(i int64, base int) string
- 第一個參數為指定數字,類型為
int64 - 第二個參數為指定進制
-
第三個參數為數字轉成指定進制數後的字符串
import ( "strconv" ) func main() { var num int64 = 2 str := strconv.FormatInt(num, 2) var num2 int64 = 17 str2 := strconv.FormatInt(num2, 16) println(str) // 10 println(str2) // 11 }上述代碼實現了將數字
2轉成二進制的形式10,將數字17轉成十六進制的形式11,並以 string 類型返回。上述數字皆代表着有符號為的int64類型,與之對應的還有無符號位的uint64類型的轉換函數FormatUint。
ParseInt:給定基數(進制數)和位數,返回對應十進制的值
ParseInt(s string, base int, bitSize int) (i int64, err error)
- 第一個參數
s為待解析的字符串 - 第二個參數
base為基數,也就是進制數,從0、2到36進制。 - 第三個參數
bitSize為位數,0、8、16、32、64位分別對應int、int8、int16、int32、int64。如果bitSize小於0或大於64,則返回錯誤。 - 第一個返回值
i為轉換之後的數字 -
第二個返回值
err為轉換時產生的錯誤信息,除了bitSize小於0或大於64,會發生錯誤以外,如果所傳的字符串s與base參數或bitSize參數不匹配,也會發生錯誤。import ( "fmt" "strconv" ) func main() { parseInt, err := strconv.ParseInt("100", 2, 64) if err != nil { fmt.Println(err.Error()) return } println(parseInt) // 4 parseInt2, err := strconv.ParseInt("666", 2, 64) if err != nil { fmt.Println(err.Error()) // strconv.ParseInt: parsing "666": invalid syntax return } println(parseInt2) }首先將二進制的
100轉成十進制,為4,然後將二進制的666轉成十進制,但是二進制所對應的數字沒有 666,因此轉換錯誤,返回strconv.ParseInt: parsing "666": invalid syntax錯誤信息。與之對應的還有返回無符號位的uint64類型的轉換函數ParseUint。
string 與 float 之間的轉換
ParseFloat:字符串類型轉浮點型類型
ParseFloat(s string, bitSize int) (float64, error)
- 第一個參數
s為帶轉換的字符串。 - 第二個參數為
bitSize為轉換後的位數,32代表float32,64代表float64。 - 第一個返回值為轉換後的浮點型數字。
-
第二個返回值為轉換過程中所產生的錯誤
import ( "fmt" "strconv" ) func main() { num, err := strconv.ParseFloat("11.05", 64) if err != nil { return } fmt.Println(num) }如果傳入的
s的語法錯誤如1s1,則轉換失敗,返回error。
FormatFloat:根據格式 fmt 和精度 prec 將浮點數 f 轉換為字符串
FormatFloat(f float64, fmt byte, prec, bitSize int) string
- 第一個參數
f為待轉換的浮點數。 - 第二個參數為格式,可選值有
b e E f g G x X。 - 第三個參數
prec為精度,精確到幾位小數。 - 返回值為轉換後的字符串。
import (
"fmt"
"strconv"
)
func main() {
str := strconv.FormatFloat(5.26, 'f', 1, 64)
fmt.Println(str) // 5.3
}
FormatFloat 函數會對結果值進行四捨五入計算。
string 與 bool 之間的轉換
ParseBool:字符串轉布爾值
ParseBool(str string) (bool, error)
- 第一個參數
str為待轉換的字符串 - 第一個返回值為轉換之後的
bool值 -
第二個返回值為轉換時所產生的錯誤。
import ( "fmt" "strconv" ) func main() { bool1, err := strconv.ParseBool("true") if err != nil { fmt.Println(err.Error()) return } fmt.Println(bool1) // true bool2, err := strconv.ParseBool("golang") if err != nil { fmt.Println(err.Error()) // strconv.ParseBool: parsing "golang": invalid syntax return } fmt.Println(bool2) }第一個字符串
true轉布爾值成功了,但是第二個字符串golang轉布爾值失敗了,因為bool類型的可選值只有true和false,其他值無法轉成布爾值。
FormatBool:布爾值轉字符串
FormatBool(b bool) string
- 參數
b為帶轉換的布爾值。 -
返回值為轉換之後的字符串。
import ( "fmt" "strconv" ) func main() { boolStr := strconv.FormatBool(true) fmt.Println(boolStr) // "true" }
小結
本文對 string 與 int 類型、float 類型和 bool 類型相互之間轉換的函數進行介紹,掌握這些函數的用法,應對開發中 string 類型與其他基本數據類型轉換的場景不成問題。
本文參與了SegmentFault 思否寫作挑戰賽活動,歡迎正在閲讀的你也加入。