Подтвердить что ты не робот

В Go, как я могу получить строковое представление структуры?

Для моего приложения не имеет значения, является ли строка понятной для человека или нет.

4b9b3361

Ответ 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="}

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

Ответ 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!