اس

استرینگر در Go

1 تمرین

درباره‌ی استرینگر

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
ویرایش از طریق GitHub این پیوند در پنجره یا زبانه‌ی جدیدی باز می‌شود

استرینگر را یاد بگیرید