10

Is there a better or more idiomatic way in Go to encode a []byte slice into an int64?

package main

import "fmt"

func main() {
    var mySlice = []byte{244, 244, 244, 244, 244, 244, 244, 244}
    var data int64
    for i := 0; i < 8; i++ {
                data |= int64(mySlice[i] & byte(255)) << uint((8*8)-((i+1)*8))
    }
    fmt.Println(data)
}

http://play.golang.org/p/VjaqeFkgBX

jsgoecke
  • 249
  • 3
  • 11

2 Answers2

7

It's such a tiny amount of code, there's some clarity gained by being able to see exactly what's going on. But this is a highly contentious opinion, so your own taste and judgement may differ.

func main() {
    var mySlice = []byte{244, 244, 244, 244, 244, 244, 244, 244}
    data := int64(0)
    for _, b := range mySlice {
        data = (data << 8) | int64(b)
    }
    fmt.Printf("%d\n", data)
}

Prints:

-795741901218843404

Playground: https://go.dev/play/p/aemkEg7a6S5

blackgreen
  • 34,072
  • 23
  • 111
  • 129
Paul Hankin
  • 54,811
  • 11
  • 92
  • 118
1

I'm not sure about idiomatic, but here's an alternative using the encoding/binary package:

package main

import (
   "bytes"
   "encoding/binary"
   "fmt"
)

func main() {
   var mySlice = []byte{244, 244, 244, 244, 244, 244, 244, 244}
   buf := bytes.NewReader(mySlice)
   var data int64
   err := binary.Read(buf, binary.LittleEndian, &data)
   if err != nil {
      fmt.Println("binary.Read failed:", err)
   }
   fmt.Println(data)
}

http://play.golang.org/p/MTyy5gIEp5

Eve Freeman
  • 32,467
  • 4
  • 86
  • 101