St

Stringer の Go

1個の演習

Stringerについて

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
GitHubで編集 リンクは新しいウィンドウまたはタブで開きます

Stringerを学習する