私は[]byte
を受け取る関数を持っていますが、私が持っているのはint
です。この変換を行う最良の方法は何ですか?
err = a.Write([]byte(myInt))
私は長い道のりを経て文字列に入れてバイトに入れることができると思いますが、それはsoundsいように聞こえ、それを行うためのより良い方法があると思います。
私は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
...
_
右? Write()は非常に一般的なdata
3番目の引数を取り、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)
}
_
"encoding/binary" パッケージを確認してください。特に Read および Write 関数:
binary.Write(a, binary.LittleEndian, myInt)
申し訳ありませんが、これは少し遅れる可能性があります。しかし、私は行くドキュメントでより良い実装を見つけたと思います。
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())