2013-05-02 13 views

risposta

14

Presumo che tu voglia qualcosa come il modo in cui C gestisce questo. Non esiste un modo per farlo. Dovrai definire la tua serializzazione e deserializzazione da e verso byte per la tua struttura. Il pacchetto binario ti aiuterà a codificare i campi della tua struct in byte, che puoi aggiungere all'array di byte, nella tua struct, ma sarai responsabile della specifica delle lunghezze e degli offset nell'array di byte che terranno i campi dalla tua struct.

Le altre opzioni sono per utilizzare uno dei pacchetti di codifica: come Gob o JSON.

EDIT:

Dal momento che si desidera che questo per fare un hash come dici nel tuo commento la cosa easisest da fare è utilizzare []byte(fmt.Sprintf("%v", struct)) in questo modo: http://play.golang.org/p/yY8mSdZ_kf

+0

Grazie per la rapida risposta. La ragione per cui sto provando a fare questo è di essere in grado di ottenere un hash (sto cercando di usare SHA-256, ma potrebbe essere un altro) della mia struttura. Sai di un modo più semplice per farlo? – abw333

+1

Ho modificato la risposta per mostrare un modo semplice per fare ciò che vuoi. –

+0

Grazie ancora. Ho provato a farlo, ma ho ricevuto il seguente messaggio di errore: "valore multiplo fmt.Printf() nel contesto a valore singolo". Sai perché sta succedendo? – abw333

7

Si dovrebbe usare un buffer byte anziché una stringa, gli altri metodi suggeriti creano uno SHA1 di lunghezza variabile, la lunghezza standard SHA1 deve essere di 20 byte (160 bit)

package main 

import (
    "crypto/sha1" 
    "fmt" 
    "encoding/binary" 
    "bytes" 
) 

type myStruct struct { 
    ID string 
    Data string 
} 

func main() { 
    var bin_buf bytes.Buffer 
    x := myStruct{"1", "Hello"} 
    binary.Write(&bin_buf, binary.BigEndian, x) 
    fmt.Printf("% x", sha1.Sum(bin_buf.Bytes())) 
} 

Prova tu: http://play.golang.org/p/8YuM6VIlLV

È un metodo davvero semplice e funziona benissimo.

+1

Le risposte di solo collegamento sono obsolete. –

+0

Grazie Der, modifico questo. È stato il mio primo commento –

+7

Non sembra che funzioni perché 'myStruct' non ha dimensioni fisse. https: //play.golang.org/p/IGA_lgRVNX –

1

Una possibile soluzione è il pacchetto standard "encoding/gob". Il pacchetto gob crea un codificatore/decodificatore che può codificare qualsiasi struttura in una matrice di byte e quindi decodificare quella matrice in una struttura. C'è un ottimo post, here.

Come altri hanno sottolineato, è necessario utilizzare un pacchetto come questo perché le strutture, per loro natura, hanno dimensioni sconosciute e non possono essere convertite in matrici di byte.

Ho incluso del codice e un play.

package main 

import (
    "bytes" 
    "encoding/gob" 
    "fmt" 
    "log" 
) 

type P struct { 
    X, Y, Z int 
    Name string 
} 

type Q struct { 
    X, Y *int32 
    Name string 
} 

func main() { 
    // Initialize the encoder and decoder. Normally enc and dec would be 
    // bound to network connections and the encoder and decoder would 
    // run in different processes. 
    var network bytes.Buffer  // Stand-in for a network connection 
    enc := gob.NewEncoder(&network) // Will write to network. 
    dec := gob.NewDecoder(&network) // Will read from network. 
    // Encode (send) the value. 
    err := enc.Encode(P{3, 4, 5, "Pythagoras"}) 
    if err != nil { 
     log.Fatal("encode error:", err) 
    } 

    // HERE ARE YOUR BYTES!!!! 
    fmt.Println(network.Bytes()) 

    // Decode (receive) the value. 
    var q Q 
    err = dec.Decode(&q) 
    if err != nil { 
     log.Fatal("decode error:", err) 
    } 
    fmt.Printf("%q: {%d,%d}\n", q.Name, *q.X, *q.Y) 
} 
Problemi correlati