vas*_*cop 42 type-conversion go
我有一个函数可以接收[]byte
但是我拥有的是int
什么,这个转换的最佳方法是什么?
err = a.Write([]byte(myInt))
Run Code Online (Sandbox Code Playgroud)
我想我可以走很长的路,把它变成一个字符串并把它放到字节中,但听起来很难看,我想有更好的方法可以做到这一点.
dyo*_*yoo 48
我同意Brainstorm的方法:假设您传递的是机器友好的二进制表示,请使用该encoding/binary
库.OP表明binary.Write()
可能会有一些开销.纵观源的实施Write()
,我看到它做了一些运行时的决策最大的灵活性.
189 func Write(w io.Writer, order ByteOrder, data interface{}) error {
190 // Fast path for basic types.
191 var b [8]byte
192 var bs []byte
193 switch v := data.(type) {
194 case *int8:
195 bs = b[:1]
196 b[0] = byte(*v)
197 case int8:
198 bs = b[:1]
199 b[0] = byte(v)
200 case *uint8:
201 bs = b[:1]
202 b[0] = *v
...
Run Code Online (Sandbox Code Playgroud)
对?Write()接受一个非常通用的data
第三个参数,并且随着Go运行时强制进入编码类型信息,这会产生一些开销.由于Write()
您在这里做了一些运行时决策,在您的情况下根本不需要,也许您可以直接调用编码函数并查看它是否表现更好.
像这样的东西:
package main
import (
"encoding/binary"
"fmt"
)
func main() {
bs := make([]byte, 4)
binary.LittleEndian.PutUint32(bs, 31415926)
fmt.Println(bs)
}
Run Code Online (Sandbox Code Playgroud)
让我们知道这是如何表现的.
否则,如果您只是想获取整数的ASCII表示,则可以获取字符串表示(可能带有strconv.Itoa
)并将该字符串强制转换为该[]byte
类型.
package main
import (
"fmt"
"strconv"
)
func main() {
bs := []byte(strconv.Itoa(31415926))
fmt.Println(bs)
}
Run Code Online (Sandbox Code Playgroud)
Bra*_*orm 25
查看"编码/二进制"包.特别是读写功能:
binary.Write(a, binary.LittleEndian, myInt)
Run Code Online (Sandbox Code Playgroud)
Agn*_*ker 10
对不起,这可能有点晚了.但我认为我在go docs上找到了更好的实现.
buf := new(bytes.Buffer)
var num uint16 = 1234
err := binary.Write(buf, binary.LittleEndian, num)
if err != nil {
fmt.Println("binary.Write failed:", err)
}
fmt.Printf("% x", buf.Bytes())
Run Code Online (Sandbox Code Playgroud)