在Go中将string转换为整数types?
我试图将从flag.Arg(n)
返回的string转换为一个int
。 Go的惯用方法是什么?
例如,
package main import ( "flag" "fmt" "os" "strconv" ) func main() { flag.Parse() s := flag.Arg(0) // string to int i, err := strconv.Atoi(s) if err != nil { // handle error fmt.Println(err) os.Exit(2) } fmt.Println(s, i) }
转换简单的string
最简单的方法是使用strconv.Atoi()
函数。
请注意,还有很多其他的方法。 例如, fmt.Sscan()
和strconv.ParseInt()
可以提供更大的灵活性,例如可以指定基本大小和比特大小。 也正如strconv.Atoi()
的文档中所指出的strconv.Atoi()
:
Atoi是ParseInt(s,10,0)的简写。
以下是使用上述function的示例(在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
parsing自定义string
还有一个方便的fmt.Sscanf()
,与格式化string相比,它提供了更大的灵活性,您可以在inputstring
指定数字格式(如宽度,基数等)以及额外的额外字符。
这对parsing包含数字的自定义string非常有用。 例如,如果您的input是以"id:00123"
forms提供的,并且前缀为"id:"
,并且数字固定为5位数字,则用零填充(如果更短),则可以非常容易地进行parsing:
s := "id:00123" var i int if _, err := fmt.Sscanf(s, "id:%5d", &i); err == nil { fmt.Println(i) // Outputs 123 }
这里有三种方法将stringparsing为整数,从最快运行时到最慢:
-
strconv.Sscanf(...)
最快 -
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 < bN; 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 < bN; i++ { x, err := strconv.Atoi(numstr) if x != num || err != nil { b.Error(err) } } } func BenchmarkFmtSscan(b *testing.B) { for i := 0; i < bN; 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
来运行它go test -bench=. 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