簡體   English   中英

將字符串解析為特定類型的 int(int8、int16、int32、int64)

[英]Parse string to specific type of int (int8, int16, int32, int64)

我正在嘗試在 Go 中將字符串解析為整數。 我發現它的問題在文檔中,它提到的語法如下:

ParseInt(s string, base int, bitSize int)

其中, s是要解析的字符串, base由字符串的前綴隱含:base 16 表示“0x”,base 8 表示“0”,否則為 base 10。

bitSize參數是我bitSize問題的地方。 根據ParseInt 的文檔,它指定結果必須適合的整數類型。 位大小 0、8、16、32 和 64 對應於 int、int8、int16、int32 和 int64。

但是對於像 0、8、16、32 和 64 這樣的所有值。我得到相同類型的返回值。 即 int64 類型。

誰能指出我缺少什么。

代碼: https : //play.golang.org/p/F3LbUh_maY

根據文檔

func ParseInt(s string, base int, bitSize int) (i int64, err 錯誤)

無論如何,ParseInt 總是返回int64 而且

bitSize 參數指定結果必須適合的整數類型

所以基本上你的bitSize參數只告訴你要解析的字符串值在解析后應該適合 bitSize。 如果沒有,就會發生超出范圍。

就像在這個PlayGround 中strconv.ParseInt("192", 10, 8) (如您所見,解析后的值將大於int8最大值)。

如果您想將其解析為您需要的任何值,只需在之后使用int8(i)int8int16int32 )。

PS因為您觸及了如何轉換為特定 intX 的主題,我將概述也可以轉換為unsigned int

ParseInt總是返回一個int64 ,您需要將結果轉換為您想要的類型。 當您將32作為第三個參數傳遞時,如果解析的值不適合int32 ,您將收到解析錯誤,但返回的類型始終為int64

例如:

i, err := strconv.ParseInt("9207", 10, 32)
if err != nil {
    panic(err)
}
result := int32(i)
fmt.Printf("Parsed int is %d\n", result)

您提到的函數的源代碼如下:

func ParseInt(s string, base int, bitSize int) (i int64, err error)

因此它將始終返回int64

請注意,如果要將int32轉換為int64 ,只需使用int64()就不會有任何問題。

但是將int64轉換為int32是不安全的。 如果您要轉換的數字大於int32的最大值,則結果值將是錯誤的。 因此,不建議使用int32()int64轉換為int32

您可以使用Sscan

package main
import "fmt"

func main() {
   {
      var n int8
      fmt.Sscan("100", &n)
      fmt.Println(n == 100)
   }
   {
      var n int16
      fmt.Sscan("100", &n)
      fmt.Println(n == 100)
   }
   {
      var n int32
      fmt.Sscan("100", &n)
      fmt.Println(n == 100)
   }
   {
      var n int64
      fmt.Sscan("100", &n)
      fmt.Println(n == 100)
   }
}

https://golang.org/pkg/fmt#Sscan

關於將string轉換為int ,我做了一個測試,我推薦方法2( strconv.Atoi("1339882") ):

func BenchmarkGetN(b *testing.B)  {
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        i, err := strconv.ParseInt("1339882", 10, 32)
        if err != nil {
            panic(err)
        }
        a := int32(i)
        _ = a
    }
}

func BenchmarkGetN2(b *testing.B) {
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        a, _ := strconv.Atoi("1339882")
        bc := int32(a)
        _ = bc
    }
}
goos: darwin
goarch: amd64
pkg: phonedata
BenchmarkGetN-4         100000000               20.0 ns/op
BenchmarkGetN2-4        200000000                9.25 ns/op
PASS
ok      phonedata       10.913s

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM