web-dev-qa-db-fra.com

En Golang, comment convertir une tranche en tableau

Je suis nouveau sur Go et j'essaie d'écrire une application qui lit les fichiers RPM. Le début de chaque bloc a un caractère magique de [4]byte

Voici ma struct

type Lead struct {
  Magic        [4]byte
  Major, Minor byte
  Type         uint16
  Arch         uint16
  Name         string
  OS           uint16
  SigType      uint16
}

J'essaie de faire ce qui suit:

lead := Lead{}
lead.Magic = buffer[0:4]

Je cherche en ligne et je ne suis pas sûr de savoir comment passer d'une tranche à un tableau (sans copier). Je peux toujours créer le []byte magique (ou même le uint64), mais j'étais plus curieux de savoir comment passer du type []byte au [4]byte si nécessaire.

24
ekaqu

La méthode intégrée copy ne copie qu'une tranche dans une tranche, PAS une tranche dans un tableau.

Vous devez tromper copier en pensant que le tableau est une tranche

copy(varLead.Magic[:], someSlice[0:4])

Ou utilisez une boucle for pour faire la copie:

for index, b := range someSlice {

    varLead.Magic[index] = b

}

Ou faites comme zupa en utilisant des littéraux. J'ai ajouté à leur exemple de travail.

Go Playground

32
twinj

Vous avez alloué quatre octets à l'intérieur de cette structure et souhaitez attribuer une valeur à cette section de quatre octets. Il n'y a pas de moyen conceptuel de le faire sans copier.

Regardez la variable copy pour savoir comment faire cela.

11
Dustin

Essaye ça: 

copy(lead.Magic[:], buf[0:4])
7
Kevin Yuan

Vous pourrez peut-être tout faire en une seule lecture au lieu de lire individuellement dans chaque champ. Si les champs ont une longueur fixe, vous pouvez alors:

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)
0
Jakob Weisblat