[英]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 類型。
誰能指出我缺少什么。
根據文檔
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)
( int8
、 int16
、 int32
)。
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)
}
}
關於將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.