St

Stringer у Go

1 вправа

Про концепцію Stringer

Stringer — це інтерфейс для визначення формату рядка тексту (англ. string) для значень.

Інтерфейс складається з одного методу String:

type Stringer interface {
    String() string
}

Типи, які хочуть реалізувати цей інтерфейс, повинні мати метод String(), що повертає зручне для людини подання типу у вигляді рядка тексту. Пакет fmt (і багато інших) шукатиме цей метод, щоб форматувати й друкувати значення.

Приклад: відстані

Уявімо, що ми працюємо над застосунком, який має справу з географічними відстанями, виміряними в різних одиницях. Ми визначили типи DistanceUnit і Distance так:

type DistanceUnit int

const (
	Kilometer    DistanceUnit = 0
	Mile         DistanceUnit = 1
)

type Distance struct {
	number float64
	unit   DistanceUnit
}

У прикладі вище Kilometer і Mile — це константи типу DistanceUnit.

Ці типи не реалізують інтерфейс Stringer, бо в них немає методу String. Тому функції fmt будуть друкувати значення Distance у «типовому форматі» Go:

mileUnit := Mile
fmt.Sprint(mileUnit)
// => 1
// The result is '1' because that is the underlying value of the 'Mile' constant (see constant declarations above)

dist := Distance{number: 790.7, unit: Kilometer}
fmt.Sprint(dist)
// => {790.7 0}
// not a very useful output!

Щоб зробити вихідні дані інформативнішими, ми реалізуємо інтерфейс Stringer для типів DistanceUnit і Distance, додавши метод String до кожного з них:

func (sc DistanceUnit) String() string {
	units := []string{"km", "mi"}
	return units[sc]
}

func (d Distance) String() string {
	return fmt.Sprintf("%v %v", d.number, d.unit)
}

Функції пакета fmt будуть викликати ці методи, коли форматують значення Distance:

kmUnit := Kilometer
kmUnit.String()
// => km

mileUnit := Mile
mileUnit.String()
// => mi

dist := Distance{
	number: 790.7,
	unit: Kilometer,
}
dist.String()
// => 790.7 km
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці

Вивчити концепцію Stringer