Как преобразовать структуру в строку [duplicate]

Вы должны сначала указать родительский div relative :

  & lt; div style = "height: 80px; padding-left: 20px; position: relative;  «& GT;   
37
задан abw333 2 May 2013 в 06:39
поделиться

3 ответа

Один популярный способ кодирования структур в строки использует 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

45
ответ дан Matheus Santana 15 August 2018 в 15:21
поделиться
  • 1
    Именно то, что мне нужно! +1 к вам – abw333 2 May 2013 в 17:07
  • 2
    Я заметил, что вы второй вопрос и какая у вас цель. JSON может быть полезен, но нет, если выходная строка должна использоваться для создания хэша для проверки равенства. У вас будут проблемы с картами, как указано в Записании. Это касается использования fmt.Sprintf. – ANisus 3 May 2013 в 12:19
  • 3
    Не знал, что ключи должны быть капитализированы, чтобы быть в JSON. – jiyinyiyong 16 December 2013 в 19:19

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

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

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

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

Если вам нужна двухсторонняя сериализация, JSON, Gob или XML являются самыми легкими / встроенными параметрами в Go, см. пакеты кодирования .

58
ответ дан Ask Bjørn Hansen 15 August 2018 в 15:21
поделиться
  • 1
    Спасибо за ваш ответ. Я должен был, вероятно, указать в своем вопросе, что я хочу получить значение в своей программе, а не в консоли. В частности, я хотел бы преобразовать строку в массив байтов. Когда я делаю & quot; [byte (fmt.Printf («% v», var)), программа жалуется на «многозначное значение fmt.Printf () в контексте с одним значением». Я предполагаю, что это потому, что Printf не возвращает строковое значение, а только печатает его на консоли. Вы знаете, как это исправить. – abw333 2 May 2013 в 16:51
  • 2
    Я понял, как это сделать, используя ответ ANisus, но +1 к вам за хороший ответ. – abw333 2 May 2013 в 17:04
  • 3
    Если вам понадобится программа, используйте fmt.Sprintf вместо Printf. Если вы используете JSON, остерегайтесь того, что значения карты не могут быть возвращены в том же порядке для каждого запуска (хотя это может быть и для fmt printf, также я не проверял). – Ask Bjørn Hansen 2 May 2013 в 19:06

вы также можете добавить функцию с этим структурным ресивером.

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

Итак, печать этого поля struct вернет строку.

fmt.Println(urls.URLS)
0
ответ дан Santosh Pillai 15 August 2018 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: