В Golang, как вы преобразовываете срез в массив
Я новичок в Go и пытаюсь написать приложение, которое читает RPM файлы. Начало каждого блока имеет Magic char of [4]byte
.
Вот моя структура
type Lead struct {
Magic [4]byte
Major, Minor byte
Type uint16
Arch uint16
Name string
OS uint16
SigType uint16
}
Я пытаюсь сделать следующее:
lead := Lead{}
lead.Magic = buffer[0:4]
Я ищу в Интернете и не уверен, как перейти от среза к массиву (без копирования). Я всегда могу сделать Magic []byte
(или даже uint64
), но мне было любопытно, как мне перейти от типа []byte
к [4]byte
, если нужно?
Ответы
Ответ 1
Встроенная копия метода копирует только срез в срез NOT, а не срез в массив.
Вы должны обмануть копию, думая, что массив - это срез
copy(varLead.Magic[:], someSlice[0:4])
Или используйте цикл for для копирования:
for index, b := range someSlice {
varLead.Magic[index] = b
}
Или сделайте так, как zupa сделал с использованием литералов. Я добавил в их рабочий пример.
Перейти на площадку
Ответ 2
Вы выделили четыре байта внутри этой структуры и хотите присвоить значение этой секции с четырьмя байтами. Нет никакого концептуального способа сделать это без копирования.
Посмотрите на встроенный copy
способ сделать это.
Ответ 3
Попробуйте следующее:
copy(lead.Magic[:], buf[0:4])
Ответ 4
Возможно, вы сможете сделать все это с помощью одного прочитанного, вместо того, чтобы читать по отдельности в каждом поле. Если поля фиксированной длины, вы можете сделать:
lead := Lead{}
// make a reader to dispense bytes so you don't have to keep track of where you are in buffer
reader := bytes.NewReader(buffer)
// read into each field in Lead, so Magic becomes buffer[0:4],
// Major becomes buffer[5], Minor is buffer[6], and so on...
binary.Read(reader, binary.LittleEndian, &lead)
Ответ 5
не делать. Сам срез достаточно для всех целей. Массив в go lang следует рассматривать как основную структуру среза. В каждом отдельном случае используйте только срез. Вам не нужно массировать себя. Вы просто делаете все по синтаксису среза. Массив предназначен только для компьютера. В большинстве случаев срез лучше, ясный в коде. Даже в других случаях разреза достаточно, чтобы отразить вашу идею.