Я согласен с подходом BrainStorm не в: если предположить, что вы передаете машину дружественный бинарное представление, используйте encoding/binary
библиотеку. OP предполагает, что binary.Write()
может иметь некоторые накладные расходы. Рассматривая the source для реализации 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
, и это накладывает некоторые накладные расходы, так как время выполнения 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)
}
Закончено с использованием небольшого варианта вашего первого предложения. Должен был погрузиться в реализацию сам, спасибо за подсказку. – vascop