[]byte
有两种方式来表达一个数字:
- 如
[]byte{1, 2, 3, 4}
,存储的是 4 字节长度的整型值;在大端情况下表示十进制数字 4660 - 如
[]byte{54, 54, 49, 49}
,其中存储的是数字字符("1", "2")对应的 ASCII 编码;这个例子中对应 6611
对于第一种,在知道数据的大小端情况、[]byte
的长度后,选择 encoding/binary
包中相应函数处理即可:
package main
import "fmt"
import "encoding/binary"
func main() {
var mySlice = []byte{244, 244, 244, 244, 244, 244, 244, 244}
data := binary.BigEndian.Uint64(mySlice)
fmt.Println(data)
}
对于第二种情况,有两种做法:
func BenchmarkParsingBytes1(b *testing.B) {
buf := []byte{54, 54, 49, 49}
_, _ = strconv.Atoi(string(buf))
}
func BenchmarkParsingBytes2(b *testing.B) {
buf := []byte{54, 54, 49, 49}
var x int32
for _, c := range buf {
x = x*10 + int32(c - '0')
}
}
Benchmark 结果如下:
goos: darwin
goarch: amd64
pkg: git.garena.com/shopee/chatbot/data-sync/common/service/datastore/writers
cpu: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
BenchmarkParsingBytes1
BenchmarkParsingBytes1-16 1000000000 0.0000009 ns/op
BenchmarkParsingBytes2
BenchmarkParsingBytes2-16 1000000000 0.0000003 ns/op
可以看到,将 []byte
转成 string
中的拷贝带来了不必要的消耗。