zgadzam się z podejściem Brainstorm jest: zakładając, że jesteś przechodzącą maszynowego przyjazny reprezentację binarną, korzystania z biblioteki encoding/binary
. OP sugeruje, że binary.Write()
może mieć trochę narzut. Patrząc na the source dla realizacji Write()
, widzę, że robi pewne decyzje dotyczące czasu wykonywania dla maksymalnej elastyczności.
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
...
Dobrze? Write() przyjmuje bardzo ogólny trzeci argument, a to powoduje narzucenie pewnych kosztów, ponieważ środowisko wykonawcze Go jest następnie wymuszane na informacji typu kodowania. Ponieważ Write()
robi tutaj pewne decyzje dotyczące runtime, których po prostu nie potrzebujesz w swojej sytuacji, możesz po prostu bezpośrednio wywołać funkcje kodowania i sprawdzić, czy działa lepiej.
coś takiego:
package main
import (
"encoding/binary"
"fmt"
)
func main() {
bs := make([]byte, 4)
binary.LittleEndian.PutUint32(bs, 31415926)
fmt.Println(bs)
}
Daj nam znać jak to działa.
W przeciwnym razie, jeśli próbujesz uzyskać reprezentację ASCII liczby całkowitej, możesz uzyskać reprezentację ciągu (prawdopodobnie z strconv.Itoa
) i przesłać ten ciąg do typu []byte
.
package main
import (
"fmt"
"strconv"
)
func main() {
bs := []byte(strconv.Itoa(31415926))
fmt.Println(bs)
}
Skończyło się na małej zmianie pierwszej sugestii. Powinienem był sam zagłębić się w realizację, dzięki za napiwek. – vascop