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.
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.
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.
Essaye ça:
copy(lead.Magic[:], buf[0:4])
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)