En Go, comment puis-je convertir une structure d'un tableau d'octets?
J'ai une instance d'une structure que j'ai défini et je voudrais le convertir en un tableau d'octets. J'ai essayé []byte(my_struct), mais cela ne fonctionne pas. Aussi, j'ai été rappelé à l' paquet binaire, mais je ne suis pas sûr de quelle fonction je dois utiliser et comment je dois l'utiliser. Un exemple serait grandement apprécié.
OriginalL'auteur abw333 | 2013-05-02
Vous devez vous connecter pour publier un commentaire.
Je suppose que vous voulez quelque chose comme la façon dont C gère cela. Il n'est pas intégré dans la façon de le faire. Vous devrez définir votre propre sérialisation et de désérialisation et d'octets pour votre structure. Le paquet binaire va vous aider à coder
les champs de votre structure d'octets que vous pouvez ajouter dans le tableau d'octets, mais vous serez responsable de la spécification de la longueur et les décalages dans le tableau d'octets qui va contenir les champs de votre structure.
Vos autres options sont à utiliser l'un de l'encodage des paquets: http://golang.org/pkg/encoding/ comme gob ou json.
EDIT:
Puisque vous voulez ceci pour faire un hachage comme vous le dites dans votre commentaire le easisest chose à faire est d'utiliser
[]byte(fmt.Sprintf("%v", struct))
comme suit: http://play.golang.org/p/yY8mSdZ_kfJ'ai édité la réponse à montrer un moyen facile de faire ce que vous voulez.
Merci encore. J'ai essayé de faire ça, mais j'ai eu le message d'erreur suivant: "le multiple de la valeur de l'esf.Printf() dans le seul contexte de valeurs". Vous savez pourquoi ce qui se passe?
c'est parce que l'utilisation de
Printf
semble être une faute de frappe. Vous devez utiliserSprintf
, comme cela est démontré par le code derrière le lien en de Jeremy de réponse.ouais désolé à ce sujet. C'était une faute de frappe.
OriginalL'auteur Jeremy Wall
Une solution possible est la
"encoding/gob"
paquet standard. Le gouvernement burundais package crée un encodeur/décodeur qui peut encoder n'importe quel struct dans un tableau d'octets et puis décoder la matrice de retour dans une struct. Il y a un grand poste, ici.Comme d'autres l'ont souligné, il est nécessaire d'utiliser un paquet comme ça parce que les structures, de par leur nature, sont inconnus en tailles et ne peuvent être convertis dans des tableaux d'octets.
J'ai inclus un peu de code et un jouer.
OriginalL'auteur Adam
Vous devez utiliser un tampon octets au lieu d'une corde, les autres méthodes proposées créer un SHA1 de longueur variable, le SHA1 de longueur standard doit être de 20 octets (160 bits)
Essayez-le vous-même: http://play.golang.org/p/8YuM6VIlLV
C'est une méthode très facile et il fonctionne très bien.
Merci Der, je vais modifier cela. A été mon premier commentaire.
N'a pas l'air comme cela fonctionne parce que
myStruct
n'est pas de taille fixe. play.golang.org/p/IGA_lgRVNXFait-il? Vérifier le tre retourné à partir de binaires.Écriture révèle "binaire.Écrire: invalid type principal.myStruct"....
Si vous utilisez un système x86 assurez-vous d'utiliser les binaires.Little-endian.
OriginalL'auteur Hugo Enrique Arganda Salazar
Je sais que ce fil est vieux, mais aucune des réponses ont été acceptées, et il y a une manière assez simple à faire.
https://play.golang.org/p/TedsY455EBD
important de code à partir de l'aire de jeux
OriginalL'auteur Cody Jacques
Avez-vous envisagé de sérialisation dans bfils? http://labix.org/gobson
OriginalL'auteur Erik St. Martin
Prendre un coup d'oeil à https://blog.golang.org/go-slices-usage-and-internals
Plus précisément tranche internes. L'idée est de reproduire la tranche de la structure interne et le point à notre structure au lieu d'une séquence d'octets:
De sortie:
https://play.golang.org/p/Rh_yrscRDV6
OriginalL'auteur Kax