Интерфейс fmt.Stringer
Интерфейс fmt.Stringer определен в пакете fmt
и позволяет управлять строковым представлением пользовательских типов.
Он содержит единственный метод String, который возвращает строку.
Когда тип реализует этот интерфейс, функции пакета fmt,
такие как fmt.Print, fmt.Println и fmt.Sprintf,
будут использовать метод String для получения строкового представления значения.
Синтаксис
type Stringer interface {
String() string
}
Пример
Давайте реализуем интерфейс fmt.Stringer для пользовательской
структуры User:
package 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)
}
Результат выполнения кода:
"User: John, Age: 30"
Пример
Реализация fmt.Stringer для типа IPAddress
для форматированного вывода IP-адреса:
package 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)
}
Результат выполнения кода:
"192.168.1.1"
Пример
Интерфейс fmt.Stringer также работает с указателями.
Рассмотрим реализацию для структуры Rectangle:
package 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)
}
Результат выполнения кода:
"Rectangle (width: 10, height: 5)"
Пример
Если тип не реализует fmt.Stringer, то fmt.Println
выводит значение в формате по умолчанию. Сравним поведение:
package 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)
}
Результат выполнения кода:
"Without Stringer: {3 4}"
"With Stringer: (3, 4)"
Смотрите также
-
интерфейс
fmt.GoStringer,
который определяет представление типа в синтаксисе Go -
интерфейс
fmt.Formatter,
который дает полный контроль над форматированием -
функцию
fmt.Println,
которая выводит строки с переводом строки -
функцию
fmt.Sprintf,
которая форматирует строку без вывода