将整数转换为字节数组
来源:https://www.golang-tech-stack.com/qa/2759
热度:498 更新时间:2023-03-11
文章导读: 问题内容我有一个接收 a 的函数,[]byte但我拥有的是一个int,进行这种转换的最佳方法是什么?err = a.Write([]byte(myInt))我想我可以走很长的路,把它变成一个字符串,然后把它变成字节,但这听起来很难看。
问题内容
我有一个接收 a 的函数,[]byte
但我拥有的是一个int
,进行这种转换的最佳方法是什么?
err = a.Write([]byte(myInt))
我想我可以走很长的路,把它变成一个字符串,然后把它变成字节,但这听起来很难看,我想有更好的方法来做到这一点。
正确答案
我同意 Brainstorm 的方法:假设您传递的是机器友好的二进制表示,请使用该encoding/binary
库。OP
建议这binary.Write()
可能会有一些开销。查看实现的源代码Write()
,我发现它做了一些运行时决策以获得最大的灵活性。
func Write(w io.Writer, order ByteOrder, data interface{}) error {
// Fast path for basic types.
var b [8]byte
var bs []byte
switch v := data.(type) {
case *int8:
bs = b[:1]
b[0] = byte(*v)
case int8:
bs = b[:1]
b[0] = byte(v)
case *uint8:
bs = b[:1]
b[0] = *v
...
正确的?Write() 接受了一个非常通用的data
第三个参数,这会增加一些开销,因为 Go
运行时会被迫对类型信息进行编码。由于Write()
在这里做一些你在你的情况下根本不需要的运行时决策,也许你可以直接调用编码函数,看看它是否表现更好。
像这样的东西:
package main
import (
"encoding/binary"
"fmt"
)
func main() {
bs := make([]byte, 4)
binary.LittleEndian.PutUint32(bs, 31415926)
fmt.Println(bs)
}
让我们知道这是如何执行的。
否则,如果您只是想获取整数的 ASCII
表示,则可以获取字符串表示(可能使用strconv.Itoa
)并将该字符串转换为[]byte
类型。
package main
import (
"fmt"
"strconv"
)
func main() {
bs := []byte(strconv.Itoa(31415926))
fmt.Println(bs)
}