Ответ
Для преобразования 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
, так как этот код более читаемый, явный и менее подвержен ошибкам, связанным с порядком байтов.