2013-05-02 13 views

Odpowiedz

14

Zakładam, że chcesz czegoś podobnego do sposobu, w jaki to robi. Nie ma wbudowanego sposobu, aby to zrobić. Będziesz musiał zdefiniować własną serializację i deserializację do i od bajtów dla twojej struktury. Pakiet binarny pomoże ci kodować pola w twojej strukturze do bajtów, które możesz dodać do tablicy bajtów, ale będziesz odpowiedzialny za określenie długości i przesunięć w tablicy bajtów, które będą utrzymywać pola z twojej struktury.

Twoje inne opcje to użycie jednego z pakietów kodujących: http://golang.org/pkg/encoding/, takich jak gob lub json.

EDIT:

Ponieważ chcesz to dla dokonywania hash jak mówisz w swoim skomentować easisest rzeczą do zrobienia jest używać []byte(fmt.Sprintf("%v", struct)) tak: http://play.golang.org/p/yY8mSdZ_kf

+0

Dziękuję za szybką odpowiedź. Powodem, dla którego próbuję to zrobić, jest możliwość uzyskania skrótu (próbuję użyć SHA-256, ale może to być kolejna) mojej struktury. Czy znasz łatwiejszy sposób na zrobienie tego? – abw333

+1

Edytowałem odpowiedź, aby pokazać łatwy sposób na zrobienie tego, co chcesz. –

+0

Jeszcze raz dziękuję. Próbowałem to zrobić, ale dostałem następujący komunikat o błędzie: "wiele wartości fmt.Printf() w kontekście jednej wartości". Czy wiesz, dlaczego tak się dzieje? – abw333

7

Należy użyć bufora bajtów zamiast łańcucha, inne proponowane metody tworzenia SHA1 o zmiennej długości, długość standardowa SHA1 musi być 20 bajtów (160 bitów)

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())) 
} 

Spróbuj to sam: http://play.golang.org/p/8YuM6VIlLV

To naprawdę łatwa metoda i działa świetnie.

+1

Odpowiedzi dotyczące wyłącznie linków są przestarzałe. –

+0

Dziękuję Der, będę to edytować. Był mój pierwszy komentarz. –

+7

Wygląda inaczej, ponieważ 'myStruct' nie ma ustalonego rozmiaru. https: //play.golang.org/p/IGA_lgRVNX –

1

Jednym z możliwych rozwiązań jest standardowy pakiet "encoding/gob". Pakiet gob tworzy koder/dekoder, który może kodować dowolną strukturę do tablicy bajtów, a następnie dekodować tę tablicę z powrotem do struktury. Jest świetny wpis, here.

Jak już inni zauważyli, konieczne jest użycie takiego pakietu, ponieważ struktury, ze swojej natury, mają nieznane rozmiary i nie można ich przekształcić w tablice bajtów.

Dołączyłem kod i 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) 
} 
Powiązane problemy