Глагол форматирования %+v

Глагол форматирования %+v из пакета fmt используется для вывода значений переменных с дополнительной информацией. В отличие от стандартного %v, этот глагол для структур выводит не только значения полей, но и их имена, что значительно упрощает отладку и анализ данных. Для других типов данных %+v работает аналогично %v, но для структур это незаменимый инструмент.

Синтаксис

gofmt.Printf("%+v", value)

Пример со структурой

Давайте выведем структуру с помощью %+v и сравним с обычным %v:

gopackage main

import "fmt"

type Person struct {
  Name string
  Age  int
  City string
}

func main() {
  p := Person{Name: "Alice", Age: 30, City: "London"}
  fmt.Printf("%%v: %v\n", p)
  fmt.Printf("%%+v: %+v\n", p)
}

Результат выполнения кода:

go%v: {Alice 30 London}
%+v: {Name:Alice Age:30 City:London}

Пример со вложенными структурами

Глагол %+v рекурсивно выводит имена полей для вложенных структур:

gopackage main

import "fmt"

type Address struct {
  Street string
  Zip  int
}

type Employee struct {
  Name  string
  Age   int
  Address Address
}

func main() {
  e := Employee{
    Name: "Bob",
    Age:  28,
    Address: Address{
      Street: "Oxford St",
      Zip:  12345,
    },
  }
  fmt.Printf("%%+v: %+v\n", e)
}

Результат выполнения кода:

go%+v: {Name:Bob Age:28 Address:{Street:Oxford St Zip:12345}}

Пример с указателями и нулевыми значениями

Глагол %+v корректно обрабатывает указатели и отображает нулевые значения полей:

gopackage main

import "fmt"

type Item struct {
  ID   int
  Title  string
  Active bool
  Next   *Item
}

func main() {
  item := Item{
    ID:   1,
    Title:  "First",
    Active: false,
    Next:   nil,
  }
  fmt.Printf("%%+v: %+v\n", item)
}

Результат выполнения кода:

go%+v: {ID:1 Title:First Active:false Next:<nil>}

Пример с неэкспортируемыми полями

Глагол %+v не выводит имена неэкспортируемых (приватных) полей, только их значения, если они доступны:

gopackage main

import "fmt"

type User struct {
  Name  string
  age   int // неэкспортируемое поле
  email string
}

func main() {
  u := User{Name: "Charlie", age: 25, email: "charlie@example.com"}
  fmt.Printf("%%+v: %+v\n", u)
  fmt.Printf("%%v: %v\n", u)
}

Результат выполнения кода:

go%+v: {Name:Charlie age:25 email:charlie@example.com}
%v: {Charlie 25 charlie@example.com}

Смотрите также

  • глагол %v,
    который выводит значение в стандартном формате
  • глагол %#v,
    который выводит значение в синтаксисе Go
  • функцию fmt.Printf,
    которая форматирует и выводит строку в стандартный вывод
  • функцию fmt.Sprintf,
    которая форматирует строку и возвращает ее