博客 / 詳情

返回

一文了解 Go 標準庫 strconv

前言

上篇文章介紹了 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 為基數,也就是進制數,從 0236 進制。
  • 第三個參數 bitSize 為位數,08163264位分別對應 intint8int16int32int64。如果 bitSize 小於 0 或大於 64,則返回錯誤。
  • 第一個返回值 i 為轉換之後的數字
  • 第二個返回值 err 為轉換時產生的錯誤信息,除了 bitSize 小於 0 或大於 64,會發生錯誤以外,如果所傳的字符串 sbase 參數或 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 代表 float3264 代表 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 類型的可選值只有 truefalse,其他值無法轉成布爾值。

FormatBool:布爾值轉字符串

FormatBool(b bool) string

  • 參數 b 為帶轉換的布爾值。
  • 返回值為轉換之後的字符串。

    import (
      "fmt"
      "strconv"
    )
    
    func main() {
      boolStr := strconv.FormatBool(true)
      fmt.Println(boolStr) // "true"
    }

小結

本文對 stringint 類型、float 類型和 bool 類型相互之間轉換的函數進行介紹,掌握這些函數的用法,應對開發中 string 類型與其他基本數據類型轉換的場景不成問題。

本文參與了SegmentFault 思否寫作挑戰賽活動,歡迎正在閲讀的你也加入。
user avatar FatTiger4399 頭像 prepared 頭像 chazhoudeqingchun 頭像 cyningsun 頭像 tekin_cn 頭像 tingtr 頭像 rwxe 頭像 mylxsw 頭像 sanzhanggui 頭像 lrhao 頭像 ximinghui 頭像 fanjiapeng 頭像
17 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.