Stringerは、値の文字列フォーマットを定義するためのインターフェースです。
このインターフェースは、Stringメソッドを1つだけ持ちます。
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型の定数です。
これらの型はStringメソッドを持たないため、Stringerインターフェースを実装していません。
そのため、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型のそれぞれにStringメソッドを追加して、Stringerインターフェースを実装します。
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