Подтвердить что ты не робот

В 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, если нужно?

4b9b3361

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