在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为整数,从最快运行时到最慢:

  1. strconv.Sscanf(...)最快
  2. strconv.Atoi(...)仍然非常快
  3. 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