三种方式
性能最佳
bitSize参数不会将字符串转换为您选择的类型, 而只是在此处将结果限制为特定的“位”
func ParseInt(s string, base int, bitSize int) (i int64, err error)
package main
import (
"fmt"
"strconv"
)
func main() {
i, err := strconv.ParseInt("123", 10, 64)
if err != nil {
panic(err)
}
fmt.Println(i)
}
如果需要int32,按照以下方式进行转换(bitSize设置为32后再使用int32进行强制转换),避免数据丢失。
s := "2147483647" // biggest int32
i64, err := strconv.ParseInt(s, 10, 32)
...
i := int32(i64)
灵活输出
fmt.Scanf()
内部使用的是Fscanf
func Sscanf(str string, format string, a ...interface{}) (n int, err error)
package main
import (
"fmt"
)
func main() {
s := "123"
var i int
if _, err := fmt.Sscanf(s, "%d", &i); err == nil {
fmt.Println(i)
}
}
性能居中
strconv.Atoi(string)
此种方式等价于ParseInt(s, 10, 0),之后在使用int强制转换
func Atoi(s string) (int, error)
package main
import (
"fmt"
"strconv"
)
func main() {
i, err := strconv.Atoi("123")
if err != nil {
panic(err)
}
fmt.Println(i)
}
Benchmark 测试
package main
import (
"fmt"
"strconv"
"testing"
)
var (
num = 987654321
numstr = "987654321"
)
// strconv.ParseInt
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)
}
}
}
// strconv.Atoi
func BenchmarkStrconvAtoi(b *testing.B) {
for i := 0; i < b.N; i++ {
x, err := strconv.Atoi(numstr)
if x != num || err != nil {
b.Error(err)
}
}
}
// fmt.Sscan
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)
}
}
}
go test -bench=. strconv_int_test.go
测试机结果
台式机测试结果
goos: linux
goarch: amd64
BenchmarkStrconvParseInt-12 55742625 21.1 ns/op
BenchmarkStrconvAtoi-12 136184725 8.66 ns/op
BenchmarkFmtSscan-12 2034818 596 ns/op
PASS
ok command-line-arguments 5.081s
Mac笔记本测试结果
goos: darwin
goarch: amd64
BenchmarkStrconvParseInt-4 30791514 36.4 ns/op
BenchmarkStrconvAtoi-4 97751853 12.3 ns/op
BenchmarkFmtSscan-4 1555105 782 ns/op
PASS
ok command-line-arguments 6.188s