一尘不染

将整数转换为字节数组

go

我有一个接收a的函数,[]byte但是我所拥有的a是进行int此转换的最佳方法是什么?

err = a.Write([]byte(myInt))

我想我可以走很长一段路,然后将其放入字符串并放入字节中,但这听起来很难看,而且我认为还有更好的方法可以做到。


阅读 241

收藏
2020-07-02

共1个答案

一尘不染

我同意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)
}
2020-07-02