2013-05-02 12 views

Odpowiedz

32

Popularnym sposobem kodowania struktur w łańcuchy jest używanie JSON.

Masz pewne ograniczenia, takie jak brak uzyskania wszystkich informacji (takich jak konkretny typ każdego pola), tylko serializowanie wyeksportowanych pól i nieprzyjmowanie wartościami rekursywnymi. Jest to jednak prosty standardowy sposób serializacji danych.

przykład robocza:

package main 

import (
    "fmt" 
    "encoding/json" 
) 

type s struct { 
    Int  int 
    String string 
    ByteSlice []byte 
} 

func main() { 
    a := &s{42, "Hello World!", []byte{0,1,2,3,4}} 

    out, err := json.Marshal(a) 
    if err != nil { 
     panic (err) 
    } 

    fmt.Println(string(out)) 
} 

Daj ten wynik:

{"Int":42,"String":"Hello World!","ByteSlice":"AAECAwQ="} 

https://play.golang.org/p/sx-xdSxAOG

+0

Dokładnie to, czego potrzebowałem! +1 do ciebie – abw333

+0

Zauważyłem drugie pytanie i jaki masz cel. JSON może być użyteczny, ale nie, jeśli wyjściowy ciąg ma być użyty do utworzenia skrótu do sprawdzenia równości. Będziesz miał problemy z mapami, o czym wspomniał Ask. Dotyczy to również użycia 'fmt.Sprintf'. – ANisus

+0

Nie wiedziałem, że klucze muszą być pisane wielką literą, aby mogły być wyświetlane w JSON. – jiyinyiyong

47

Jeśli jest to "jeden sposób" serializacji (do debugowania lub rejestrowania lub cokolwiek), a następnie fmt.Printf("%#v", var) jest bardzo miły. (Aktualizacja: umieścić wyjście na ciąg zamiast drukować je, użyj str := fmt.Sprintf("%#v", var)

Jeśli rozmiar ma znaczenie można użyć %v, ale lubię %#v ponieważ będzie ona również zawierać nazwy pól i nazwę typu struct..

trzecią odmianą jest %+v która będzie zawierać nazwy pól, ale nie typu struct.

są one udokumentowane w górnej części fmt documentation.

Jeśli potrzebujesz dwukierunkową serializacji JSON, Gob o r XML są najłatwiejszymi/wbudowanymi opcjami w Go, patrz encoding packages.

+0

Dzięki za odpowiedź. Prawdopodobnie powinienem podać w moim pytaniu, że chcę uzyskać wartość w moim programie, a nie w konsoli. W szczególności chciałbym następnie przekonwertować ciąg na tablicę bajtów. Kiedy robię "[] bajt (fmt.Printf ("% v ", var))", program narzeka na "wielowartościową fmt.Printf() w kontekście pojedynczej wartości". Zakładam, że dzieje się tak dlatego, że Printf nie zwraca wartości ciągu, a jedynie drukuje ją do konsoli. Czy znasz sposób, aby to naprawić. – abw333

+0

Wymyśliłem, jak to zrobić, używając odpowiedzi ANISUSA, ale otrzymałem od ciebie +1 za dobrą odpowiedź. – abw333

+0

Jeśli potrzebujesz tego programu, użyj 'fmt.Sprintf' zamiast Printf. Jeśli korzystasz z JSON, pamiętaj, że wartości map mogą nie być zwracane w tej samej kolejności podczas każdego uruchomienia (chociaż może tak być również w przypadku printm fmt, nie sprawdziłem). –

Powiązane problemy