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

Интерфейс fmt.Stringer определен в пакете fmt и позволяет управлять строковым представлением пользовательских типов. Он содержит единственный метод String, который возвращает строку. Когда тип реализует этот интерфейс, функции пакета fmt, такие как fmt.Print, fmt.Println и fmt.Sprintf, будут использовать метод String для получения строкового представления значения.

Синтаксис

gotype Stringer interface {
  String() string
}

Пример

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

gopackage main

import "fmt"

type User struct {
  Name string
  Age  int
}

func (u User) String() string {
  return fmt.Sprintf("User: %s, Age: %d", u.Name, u.Age)
}

func main() {
  user := User{Name: "John", Age: 30}
  fmt.Println(user)
}

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

go"User: John, Age: 30"

Пример

Реализация fmt.Stringer для типа IPAddress для форматированного вывода IP-адреса:

gopackage main

import "fmt"

type IPAddress [4]byte

func (ip IPAddress) String() string {
  return fmt.Sprintf("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3])
}

func main() {
  ip := IPAddress{192, 168, 1, 1}
  fmt.Println(ip)
}

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

go"192.168.1.1"

Пример

Интерфейс fmt.Stringer также работает с указателями. Рассмотрим реализацию для структуры Rectangle:

gopackage main

import "fmt"

type Rectangle struct {
  Width  int
  Height int
}

func (r *Rectangle) String() string {
  return fmt.Sprintf("Rectangle (width: %d, height: %d)", r.Width, r.Height)
}

func main() {
  rect := &Rectangle{Width: 10, Height: 5}
  fmt.Println(rect)
}

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

go"Rectangle (width: 10, height: 5)"

Пример

Если тип не реализует fmt.Stringer, то fmt.Println выводит значение в формате по умолчанию. Сравним поведение:

gopackage main

import "fmt"

type Point struct {
  X int
  Y int
}

type PointStringer struct {
  X int
  Y int
}

func (p PointStringer) String() string {
  return fmt.Sprintf("(%d, %d)", p.X, p.Y)
}

func main() {
  p1 := Point{X: 3, Y: 4}
  p2 := PointStringer{X: 3, Y: 4}

  fmt.Println("Without Stringer:", p1)
  fmt.Println("With Stringer:", p2)
}

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

go"Without Stringer: {3 4}"
"With Stringer: (3, 4)"

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

  • интерфейс fmt.GoStringer,
    который определяет представление типа в синтаксисе Go
  • интерфейс fmt.Formatter,
    который дает полный контроль над форматированием
  • функцию fmt.Println,
    которая выводит строки с переводом строки
  • функцию fmt.Sprintf,
    которая форматирует строку без вывода