Stringer یک «اینترفیس» برای تعریف قالب رشتهای مقادیر است.
این اینترفیس یک «متد» بیشتر ندارد: 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