Dans les scénarios nécessitant l'extraction de champs spécifiques d'un tampon d'octets, les développeurs sont souvent confrontés au défi de gérer efficacement et précisément y parvenir. Pour résoudre ce problème, explorons la solution existante et envisageons des approches alternatives.
La solution fournie consiste à créer un octet.Buffer pour chaque champ, puis à utiliser binaire.Lire pour remplir le champ souhaité. champs. Bien que fonctionnelle, cette approche peut être améliorée en termes d'efficacité et de brièveté du code.
Pour améliorer la solution existante, nous pouvons exploiter la méthode .Next() de le bytes.Buffer pour ignorer les octets indésirables. Cela élimine le besoin de créer plusieurs tampons et permet un code plus concis.
p := bytes.NewBuffer(buf) // Skip [8:20) p.Next(12) // 20: uint32 binary.Read(p, binary.LittleEndian, &fs.sb.firstDataBlock)
Une approche alternative consiste à définir une structure d'en-tête qui représente les différents champs, puis lire la structure directement en utilisant binaire.Read. Cela nécessite la création d'une structure personnalisée, mais cela fournit une solution plus efficace et plus maintenable.
type Head struct { InodeCount uint32 BlockCount uint32 FirstBlock uint32 BlockSize uint32 BlocksPerGroup uint32 InodesPerBlock uint32 } func main() { var header Head err = binary.Read(file, binary.LittleEndian, &header) if err != nil { log.Fatal(err) } log.Printf("%#v\n", header) }
L'approche améliorée utilisant .Next() fournit une solution plus optimisée qui nécessite moins d'allocations et la répétition du code. L'approche de la structure d'en-tête offre une perspective différente et peut être utile lorsqu'il s'agit de structures de données plus volumineuses ou plus complexes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!