2013-05-02 2 views

ответ

32

Один популярный способ кодирования структур в строки использует JSON.

У вас есть определенные ограничения, такие как получение всей информации (например, конкретный тип каждого поля), только сериализация экспортированных полей, а не обработка рекурсивных значений. Но это простой стандартный способ сериализации данных.

Рабочий пример:

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

Дайте этот выход:

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

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

+0

То, что мне нужно! +1 к вам – abw333

+0

Я заметил, что вы второй вопрос и какая у вас цель. JSON может быть полезен, но нет, если выходная строка должна использоваться для создания хэша для проверки равенства. У вас будут проблемы с картами, как указано в Записании. Это касается использования 'fmt.Sprintf'. – ANisus

+0

Не знал, что ключи должны быть капитализированы, чтобы быть в JSON. – jiyinyiyong

47

Если это "один из способов" сериализации (для отладки или лесозаготовок или что-то), то fmt.Printf("%#v", var) очень хороший. (Update: поместить вывод в строку вместо печати, используйте str := fmt.Sprintf("%#v", var)

Если размер имеет значение вы можете использовать %v, но мне нравится %#v, потому что он также будет включать в себя имена полей и имя типа структуры..

Третья вариация %+v, которая будет включать в себя имена полей, но не типа структуры.

все они задокументированы в верхней части fmt documentation.

Если вам нужна двусторонний сериализация JSON, Gob o r XML - это самые простые/встроенные параметры в Go, см. encoding packages.

+0

Спасибо за ваш ответ. Я должен был, вероятно, указать в своем вопросе, что я хочу получить значение в своей программе, а не в консоли. В частности, я хотел бы преобразовать строку в массив байтов. Когда я делаю «[] byte (fmt.Printf («% v », var)), программа жалуется на« многозначное значение fmt.Printf() в однозначном контексте ». Я предполагаю, что это потому, что Printf не возвращает строковое значение, а только печатает его на консоли. Вы знаете, как это исправить. – abw333

+0

Я понял, как это сделать, используя ответ ANisus, но +1 к вам за хороший ответ. – abw333

+0

Если вам нужна программа, используйте 'fmt.Sprintf' вместо Printf. Если вы используете JSON, остерегайтесь того, что значения карты не могут быть возвращены в том же порядке для каждого запуска (хотя это может быть и для fmt printf, также я не проверял). –

Смежные вопросы