Интерфейс fmt.GoStringer

Интерфейс fmt.GoStringer позволяет управлять тем, как значение будет отображаться при использовании форматирования %#v. Он содержит метод GoString, который возвращает строку, представляющую значение в синтаксисе Go. Этот интерфейс полезен, когда нужно кастомизировать вывод структуры или типа для целей отладки, чтобы получить более информативное представление объекта.

Метод GoString не принимает параметров и возвращает строку. Реализуя этот метод для своего типа, вы определяете, как пакет fmt будет форматировать значение при использовании спецификатора %#v. По умолчанию, для структур %#v выводит имя типа и значения полей в фигурных скобках.

Синтаксис

gotype GoStringer interface {
  GoString() string
}

Пример

Давайте реализуем интерфейс fmt.GoStringer для пользовательской структуры:

gopackage main

import "fmt"

type User struct {
  ID   int
  Name string
}

func (u User) GoString() string {
  return fmt.Sprintf("User{ID:%d, Name:%q}", u.ID, u.Name)
}

func main() {
  user := User{ID: 1, Name: "Alice"}
  fmt.Printf("%#v\n", user)
}

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

go"User{ID:1, Name:\"Alice\"}"

Пример

Рассмотрим пример, где fmt.GoStringer возвращает строку с дополнительной информацией:

gopackage main

import "fmt"

type Rectangle struct {
  Width  int
  Height int
}

func (r Rectangle) GoString() string {
  area := r.Width * r.Height
  return fmt.Sprintf("Rectangle{Width:%d, Height:%d, Area:%d}",
    r.Width, r.Height, area)
}

func main() {
  rect := Rectangle{Width: 10, Height: 5}
  fmt.Printf("%#v\n", rect)
}

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

go"Rectangle{Width:10, Height:5, Area:50}"

Пример

Если метод GoString не реализован, то fmt использует стандартное форматирование для %#v:

gopackage main

import "fmt"

type Point struct {
  X int
  Y int
}

func main() {
  p := Point{X: 3, Y: 4}
  fmt.Printf("%#v\n", p)
}

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

go"main.Point{X:3, Y:4}"

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

  • интерфейс fmt.Stringer,
    который управляет форматированием для %s и других спецификаторов
  • спецификатор %#v,
    который выводит значение в синтаксисе Go
  • интерфейс fmt.Formatter,
    который предоставляет полный контроль над форматированием
  • спецификатор %v,
    который выводит значение в стандартном формате