Snippets: Golang: Parsing []byte to Int

28th December 2021 at 11:07am

[]byte 有两种方式来表达一个数字:

  1. []byte{1, 2, 3, 4},存储的是 4 字节长度的整型值;在大端情况下表示十进制数字 4660
  2. []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 中的拷贝带来了不必要的消耗。