Как вывести переменные структуры в консоль?
Как вывести в консоль значения полей Id
, Title
, Name
и т.д. структуры в Go?
Я работаю с этой структурой в Go:
type Project struct {
Id int64 `json:"project_id"`
Title string `json:"title"`
Name string `json:"name"`
Data Data `json:"data"`
Commits Commits `json:"commits"`
}
Мне нужно вывести значения полей Id
, Title
, Name
и других в консоль. Как я могу это сделать? Какой код мне следует использовать для достижения этой цели?
5 ответ(ов)
Мое мнение по этому поводу: стоит использовать json.MarshalIndent
— удивительно, что это не было предложено, ведь это самый простой способ. Например:
func prettyPrint(i interface{}) string {
s, _ := json.MarshalIndent(i, "", "\t")
return string(s)
}
Нет необходимости в внешних зависимостях, и результат получается хорошо отформатированным.
Я думаю, что будет лучше реализовать пользовательский метод String
, если вам нужен определенный форматированный вывод для вашей структуры.
Вот пример:
package main
import "fmt"
type Project struct {
Id int64 `json:"project_id"`
Title string `json:"title"`
Name string `json:"name"`
}
func (p Project) String() string {
return fmt.Sprintf("{Id:%d, Title:%s, Name:%s}", p.Id, p.Title, p.Name)
}
func main() {
o := Project{Id: 4, Name: "hello", Title: "world"}
fmt.Printf("%+v\n", o)
}
В этом примере мы определили метод String
для структуры Project
, который возвращает строку с форматированным представлением объекта. Теперь, когда вы вызываете fmt.Printf
, вы получите более читабельный вывод, чем просто использовать стандартный формат.
В Go вы можете использовать fmt.Printf
для вывода структуры в различных форматах. Например, чтобы вывести значения полей структуры Project
с их именами, можно использовать следующую конструкцию:
p = Project{...}
fmt.Printf("%+v", p)
Это выведет все поля структуры p
с их значениями, что удобно для отладки.
Если вам нужно отобразить структуру с указанием её типа, вы можете использовать формат %#v
:
fmt.Printf("%#v", p) // с указанием типа
Это будет выводить полное представление структуры, включая её тип и инициализацию. Такой вывод полезен для понимания структуры данных и их значений в коде.
Я предлагаю вам использовать fmt.Printf("%#v\n", s)
, так как это выведет тип структуры Go одновременно с её значением.
Вот пример кода:
package main
import (
"fmt"
"testing"
)
type student struct {
id int32
name string
}
type Project struct {
Id int64 `json:"project_id"`
Title string `json:"title"`
Name string `json:"name"`
}
func TestPrint(t *testing.T) {
s := Project{1, "title", "jack"}
fmt.Printf("%+v\n", s)
fmt.Printf("%#v\n", s)
}
Результат выполнения:
{Id:1 Title:title Name:jack}
main.Project{Id:1, Title:"title", Name:"jack"}
Таким образом, с помощью %#v
вы получите полную информацию о типе структуры вместе с её признаками, что может быть полезно для отладки.
Иногда может быть полезно вывести структуру как валидный код Go (аналогично go/ast
). Для этой цели библиотека valast отлично подходит. Вот пример, как это можно сделать:
package main
import (
"fmt"
"github.com/hexops/valast"
)
type ProjectData struct {
Title string `json:"title"`
Name string `json:"name"`
Data string `json:"data"`
Commits string `json:"commits"`
}
type Project struct {
Id int64 `json:"project_id"`
Data *ProjectData `json:"data"`
}
func main() {
p := Project{
Id: 1,
Data: &ProjectData{
Title: "Test",
Name: "Mihai",
Data: "Some data",
Commits: "Test Message",
},
}
fmt.Println(valast.String(p))
}
При запуске программы с помощью команды go run main.go
вы получите следующий вывод:
Project{Id: 1, Data: &ProjectData{
Title: "Test",
Name: "Mihai",
Data: "Some data",
Commits: "Test Message",
}}
Таким образом, вы видите, что ваша структура выводится в виде корректного Go кода. Это может быть полезно для отладки или документирования ваших структур данных.
Как проверить, содержит ли карта ключ в Go?
Разница между 'struct' и 'typedef struct' в C++?
Как эффективно объединять строки в Go
Как написать многострочные строки в Go?