我需要将int64的一部分转换为golang中的字节数组。 我可以为单个int64成功做到这一点

1
2
3
4
5
var p int64 = -3984171602573983744
fmt.Println(p)
cn := make([]byte, 8)
binary.LittleEndian.PutUint64(cn, uint64(p))
fmt.Println(cn)

如何为int64切片实现它?

更准确地说,我试图在一个写入数据库的库中调用一个函数,该函数将字节数组作为参数。 我有一片int64,我需要将其转换为字节数组,反之亦然。 这可能吗?

  • 您可能需要遍历并逐个执行此操作
  • 对于每个int64s循环,将其存储为binary.LittleEndian.PutUint64(cn[x:], yourUint64),其中x变为0、8、16...。 您的cn应该足够大以容纳所有数据(它是8的倍数)。 当您想阅读时,进行反向x1 := binary.LittleEndian.Uint64(cn[n:n+8]),其中n变为0、1、2。有关更简单的muxing-demuxing示例,请参见play.golang.org/p/YVQOAG8-Xlm。
  • @Ravi将此作为答案。
  • 非常感谢,这很成功:) play.golang.org/p/OdRakHIk1PP
  • 将字节片转换为int片的可能副本

例如,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package main

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

func main() {

    w64 := []int64{math.MinInt64, -1, 0, 1, math.MaxInt64}
    fmt.Println(w64)

    // Write []int64 to database []byte
    wbuf := new(bytes.Buffer)
    err := binary.Write(wbuf, binary.LittleEndian, w64)
    if err != nil {
        fmt.Println("binary.Write failed:", err)
    }
    db := wbuf.Bytes()
    fmt.Printf("% x
", db)

    // Read database []byte to []int64
    rbuf := bytes.NewBuffer(db)
    r64 := make([]int64, (len(db)+7)/8)
    err = binary.Read(rbuf, binary.LittleEndian, &r64)
    if err != nil {
        fmt.Println("binary.Read failed:", err)
    }
    fmt.Println(r64)
}

游乐场:https://play.golang.org/p/4OscSOGZE52

输出:

1
2
3
[-9223372036854775808 -1 0 1 9223372036854775807]
00 00 00 00 00 00 00 80 ff ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 7f
[-9223372036854775808 -1 0 1 9223372036854775807]

对于每个int64的循环,将其存储为binary.LittleEndian.PutUint64(cn[x:], yourUint64),其中x变为0,8,16...。 您的cn应该足够大以容纳所有数据(它是8的倍数)。 当您想阅读时,请执行相反的操作:x1 := binary.LittleEndian.Uint64(cn[n:n+8]),其中n变为0、1、2。

有关更简单的muxing-demuxing示例,请参见https://play.golang.org/p/YVQOAG8-Xlm。