我正在尝试将从flag.Arg(n)
返回的字符串转换为int
。在Go中,惯用的方法是什么?
我正在尝试将从flag.Arg(n)
返回的字符串转换为int
。在Go中,惯用的方法是什么?
例如strconv.Atoi
。
代码:
package main
import (
"fmt"
"strconv"
)
func main() {
s := "123"
// string to int
i, err := strconv.Atoi(s)
if err != nil {
// ... handle error
panic(err)
}
fmt.Println(s, i)
}
strconv
可以被解释为 _字符串转换_,同样地,是否有任何意义(扩展)可以使 Atoi
更容易记忆。 - Roshana Pitigalaatoi()
库函数。 - BalRog最简单的方法是使用strconv.Atoi()
函数。
请注意,还有许多其他方法。例如fmt.Sscan()
和strconv.ParseInt()
,它们提供更大的灵活性,因为您可以指定进制和位数等。正如在strconv.Atoi()
的文档中所述:
Atoi等效于ParseInt(s, 10, 0),转换为int类型。
下面是使用上述函数的示例(在Go Playground上尝试):
flag.Parse()
s := flag.Arg(0)
if i, err := strconv.Atoi(s); err == nil {
fmt.Printf("i=%d, type: %T\n", i, i)
}
if i, err := strconv.ParseInt(s, 10, 64); err == nil {
fmt.Printf("i=%d, type: %T\n", i, i)
}
var i int
if _, err := fmt.Sscan(s, &i); err == nil {
fmt.Printf("i=%d, type: %T\n", i, i)
}
输出(如果使用参数"123"
):
i=123, type: int
i=123, type: int64
i=123, type: int
还有一个方便的fmt.Sscanf()
函数,它提供了更大的灵活性,因为你可以在格式字符串中指定数字格式(如宽度、基数等),并在输入的string
中添加额外的字符。
这对于解析包含数字的自定义字符串非常有用。例如,如果你的输入以"id:00123"
的形式提供,其中你有一个前缀"id:"
和固定的5位数字,如果较短则用零填充,那么可以很容易地进行解析,如下所示:
s := "id:00123"
var i int
if _, err := fmt.Sscanf(s, "id:%5d", &i); err == nil {
fmt.Println(i) // Outputs 123
}
ParseInt
的第二个参数是什么意思? - kaushik94strconv.ParseInt()
链接,你会立刻看到:ParseInt(s string, base int, bitSize int)
。所以它是基于这个参数:_"ParseInt使用给定的进制(2到36)来解释一个字符串s"_。 - iczaint
类型的值并使用 strconv.ParseInt()
,则需要手动进行类型转换(从 int64
到 int
)。 - icza以下是三种将字符串解析为整数的方法,按速度从快到慢排序:
strconv.ParseInt(...)
最快strconv.Atoi(...)
仍然非常快fmt.Sscanf(...)
不是特别快,但最灵活下面是一个基准测试,显示每个函数的使用方法和示例时间:
package main
import "fmt"
import "strconv"
import "testing"
var num = 123456
var numstr = "123456"
func BenchmarkStrconvParseInt(b *testing.B) {
num64 := int64(num)
for i := 0; i < b.N; i++ {
x, err := strconv.ParseInt(numstr, 10, 64)
if x != num64 || err != nil {
b.Error(err)
}
}
}
func BenchmarkAtoi(b *testing.B) {
for i := 0; i < b.N; i++ {
x, err := strconv.Atoi(numstr)
if x != num || err != nil {
b.Error(err)
}
}
}
func BenchmarkFmtSscan(b *testing.B) {
for i := 0; i < b.N; i++ {
var x int
n, err := fmt.Sscanf(numstr, "%d", &x)
if n != 1 || x != num || err != nil {
b.Error(err)
}
}
}
你可以将其保存为atoi_test.go
并运行go test -bench = . atoi_test.go
来运行它。
goos: darwin
goarch: amd64
BenchmarkStrconvParseInt-8 100000000 17.1 ns/op
BenchmarkAtoi-8 100000000 19.4 ns/op
BenchmarkFmtSscan-8 2000000 693 ns/op
PASS
ok command-line-arguments 5.797s
试试这个
import ("strconv")
value := "123"
number,err := strconv.ParseUint(value, 10, 32)
finalIntNum := int(number) //Convert uint64 To int
int
是32位的平台上,默默地将在 uint32
范围内但不在 int
范围内的值进行转换,且没有发生错误。例如:值 "4234567890"
将被转换为 -60399406
。Go Playground (64 bits) - dolmen如果您控制输入数据,可以使用迷你版本。
package main
import (
"testing"
"strconv"
)
func Atoi (s string) int {
var (
n uint64
i int
v byte
)
for ; i < len(s); i++ {
d := s[i]
if '0' <= d && d <= '9' {
v = d - '0'
} else if 'a' <= d && d <= 'z' {
v = d - 'a' + 10
} else if 'A' <= d && d <= 'Z' {
v = d - 'A' + 10
} else {
n = 0; break
}
n *= uint64(10)
n += uint64(v)
}
return int(n)
}
func BenchmarkAtoi(b *testing.B) {
for i := 0; i < b.N; i++ {
in := Atoi("9999")
_ = in
}
}
func BenchmarkStrconvAtoi(b *testing.B) {
for i := 0; i < b.N; i++ {
in, _ := strconv.Atoi("9999")
_ = in
}
}
最快的选择(如果必要,请填写您的支票)。结果:
Path>go test -bench=. atoi_test.go
goos: windows
goarch: amd64
BenchmarkAtoi-2 100000000 14.6 ns/op
BenchmarkStrconvAtoi-2 30000000 51.2 ns/op
PASS
ok path 3.293s
strconv.Itoa(i)
是将整型转换为字符串的函数。参见 https://dev59.com/e2Yr5IYBdhLWcg3w0taE#62737936。strconv.Atoi(s)
是将字符串转换为整型的函数。参见 https://dev59.com/OVwZ5IYBdhLWcg3waPvX#62740786。 - user12817546