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