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函式會使用 Go 的「預設格式」來印出Distance值:
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!
為了讓輸出更有意義,我們為DistanceUnit和Distance型別實作Stringer介面,替每個型別加上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