Mat*_*ner 212 string type-conversion go
我试图从返回的字符串转换flag.Arg(n)成int.在Go中这样做的惯用方法是什么?
pet*_*rSO 264
例如,
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)
}
Run Code Online (Sandbox Code Playgroud)
icz*_*cza 59
最简单的方法是使用该strconv.Atoi()功能.
请注意,还有很多其他方法.例如fmt.Sscan(),strconv.ParseInt()它可以提供更大的灵活性,因为您可以指定base和bitsize.另外如以下文档中所述strconv.Atoi():
Atoi是ParseInt(s,10,0)的简写.
这是使用上述功能的一个例子(在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)
}
Run Code Online (Sandbox Code Playgroud)
输出(如果使用参数调用"123"):
i=123, type: int
i=123, type: int64
i=123, type: int
Run Code Online (Sandbox Code Playgroud)
还有一个方便的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
}
Run Code Online (Sandbox Code Playgroud)
mae*_*ics 16
以下是将字符串解析为整数的三种方法,从最快的运行时到最慢的:
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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以通过保存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
Run Code Online (Sandbox Code Playgroud)
尝试这个
import ("strconv")
value := "123"
number,err := strconv.ParseUint(value, 10, 32)
finalIntNum := int(number) //Convert uint64 To int
Run Code Online (Sandbox Code Playgroud)