Для моего приложения не имеет значения, является ли строка понятной для человека или нет.
В Go, как я могу получить строковое представление структуры?
Ответ 1
Одним из популярных способов кодирования структур в строки является использование 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="}
Ответ 2
Если это "односторонняя" сериализация (для отладки или ведения журнала или что-то еще), то fmt.Printf("%#v", var)
очень приятно. (Обновление: для вывода вывода в строку вместо печати, используйте str := fmt.Sprintf("%#v", var)
.
Если размер имеет значение, вы можете использовать %v
, но мне нравится %#v
, потому что он также будет содержать имена полей и имя типа структуры.
Третья вариация %+v
, которая будет включать имена полей, но не тип структуры.
Все они задокументированы в верхней части fmt documentation.
Если вам нужна двухсторонняя сериализация, JSON, Gob или XML являются самыми легкими/встроенными параметрами в Go, см. пакеты кодирования.
Ответ 3
Вы также можете добавить функцию с этим получателем структуры.
// URL : Sitemap Xml
type URL struct {
Loc string 'xml:"loc"'
}
// URLSET : Sitemap XML
type URLSET struct {
URLS []URL 'xml:"url"'
}
// converting the struct to String format.
func (u URL) String() string {
return fmt.Sprintf(u.Loc)
}
Таким образом, печать этого поля структуры вернет строку.
fmt.Println(urls.URLS)
Ответ 4
Используя json
или fmt.Sprintf
, я делаю тест,
BenchmarkStructJson-8 1000000 1773 ns/op
BenchmarkStructSprintSharp-8 200000 6139 ns/op
BenchmarkStructSprint-8 500000 2763 ns/op
BenchmarkStructSprintPlus-8 300000 4373 ns/op
BenchmarkStructJson
использует json.Marshal
@Matheus Santana
BenchmarkStructSprintSharp
: 'fmt.Sprintf("% # v", & a) @Ask Bjørn Hansen
BenchmarkStructSprint
: 'fmt.Sprintf("% v", & a)
BenchmarkStructSprintPlus
: 'fmt.Sprintf("% +v", & a)
В результате, json.Marshal
- лучшая производительность.
Ответ 5
Присоединение функции String() к именованной структуре позволяет нам преобразовывать структуру в строку.
package main
import "fmt"
type foo struct {
bar string
}
func (f foo) String() string {
return fmt.Sprintf("Foo Says: %s", f.bar)
}
func main() {
fmt.Println(foo{"Hello World!"})
}
output:
Foo Says: Hello World!