В Go (Golang) чтение данных из байтового массива — обычная задача при работе с двоичными данными или сериализованными структурами данных. В этой статье блога мы рассмотрим несколько методов выполнения этой задачи, а также примеры кода. К концу вы получите полное представление о различных методах чтения байтовых массивов в Go.
Методы чтения байтовых массивов:
- Использование типа
bytes.Reader:
Типbytes.Readerобеспечивает удобный способ чтения данных из байтового массива. Вот пример:
package main
import (
"bytes"
"fmt"
)
func main() {
data := []byte{1, 2, 3, 4, 5}
reader := bytes.NewReader(data)
// Read a single byte
b, err := reader.ReadByte()
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Read byte:", b)
// Read a slice of bytes
buf := make([]byte, 3)
_, err = reader.Read(buf)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Read slice of bytes:", buf)
}
- Использование
io.Readerиio.ReadFull:
Пакетioв Go предоставляетReadфункция, которую можно использовать сio.ReadFullдля чтения определенного количества байтов из массива байтов:
package main
import (
"fmt"
"io"
)
func main() {
data := []byte{1, 2, 3, 4, 5}
// Read a single byte
var b byte
err := io.ReadFull(bytes.NewReader(data), []byte{b})
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Read byte:", b)
// Read a slice of bytes
buf := make([]byte, 3)
err = io.ReadFull(bytes.NewReader(data), buf)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Read slice of bytes:", buf)
}
- Использование пакета
encoding/binary:
Пакетencoding/binaryпредоставляет функции для чтения двоичных данных из массивов байтов с разным порядком байтов. Вот пример:
package main
import (
"bytes"
"encoding/binary"
"fmt"
)
func main() {
data := []byte{0x01, 0x00, 0x00, 0x00}
// Read a uint32 (little endian)
var i uint32
err := binary.Read(bytes.NewReader(data), binary.LittleEndian, &i)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Read uint32:", i)
}