Как преобразовать `int32` в срез байт (`[]byte`) и обратно?

Ответ

Для преобразования int32 в срез байт и обратно в Go стандартным и наиболее безопасным способом является использование пакета encoding/binary.

Это необходимо при работе с сетевыми протоколами, файловыми форматами или при сериализации данных для хранения.

Основной подход: encoding/binary

Пакет предоставляет функциональность для работы с порядком байтов (Endianness):

  • binary.LittleEndian: Младший байт идет первым (используется в архитектуре x86).
  • binary.BigEndian: Старший байт идет первым (стандарт для сетевых протоколов).
package main

import (
    "encoding/binary"
    "fmt"
)

func main() {
    // === Из int32 в []byte ===
    var num int32 = 123456789 // Наше число

    bytes := make([]byte, 4) // int32 всегда занимает 4 байта
    binary.LittleEndian.PutUint32(bytes, uint32(num))

    fmt.Printf("Число %d в LittleEndian: %vn", num, bytes)
    // Вывод: Число 123456789 в LittleEndian: [21 205 91 7]

    // === Из []byte обратно в int32 ===
    originalNum := binary.LittleEndian.Uint32(bytes)

    fmt.Printf("Байты %v преобразованы в число: %dn", bytes, int32(originalNum))
    // Вывод: Байты [21 205 91 7] преобразованы в число: 123456789
}

Альтернативный подход: Битовые сдвиги

Этот способ менее читаем и более подвержен ошибкам, но может быть полезен для понимания процесса на низком уровне.

    var num int32 = 123456789
    bytes := make([]byte, 4)

    // Для Little Endian
    bytes[0] = byte(num)
    bytes[1] = byte(num >> 8)
    bytes[2] = byte(num >> 16)
    bytes[3] = byte(num >> 24)

Вывод: Всегда предпочитайте encoding/binary, так как этот код более читаемый, явный и менее подвержен ошибкам, связанным с порядком байтов.