Stringerインターフェース
型の表示方法をカスタマイズします
「Stringerインターフェース」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
構造体のデフォルト出力
デフォルトでは、構造体を%vで出力すると、フィールドの値がそのまま表示されます。デバッグには十分ですが、必ずしも読みやすいとは限りません。
package main
import "fmt"
type Color struct{ R, G, B int }
func main() {
c := Color{255, 0, 0}
fmt.Println(c)
}Stringerインターフェース
fmt.Stringerインターフェースには、次の1つのメソッドがあります。
String() string
このメソッドを定義した型は、出力時にどのように表示されるかを制御できます。
package main
import "fmt"
type Greeting struct{ Name string }
func (g Greeting) String() string {
return "Hello, " + g.Name
}
func main() {
fmt.Println(Greeting{"Ada"})
}自動的に使用される
ある型にString()メソッドがあると、Println、%vまたは%sを使うPrintfなどの関数は、すべて自動的にそのメソッドを呼び出します。
package main
import "fmt"
type Greeting struct{ Name string }
func (g Greeting) String() string {
return "Hi " + g.Name
}
func main() {
g := Greeting{"Bob"}
fmt.Printf("%s and %v\n", g, g)
}String()内で整形する
fmt.Sprintfを使って結果を組み立てると、整然とした独自の表示形式を作成できます。
package main
import "fmt"
type Color struct{ R, G, B int }
func (c Color) String() string {
return fmt.Sprintf("rgb(%d, %d, %d)", c.R, c.G, c.B)
}
func main() {
fmt.Println(Color{255, 128, 0})
}名前付き型でStringerを使う
Stringerは構造体だけのものではありません。intを基にした型など、任意の名前付き型で実装できます。これは典型的な列挙型のパターンです。
package main
import "fmt"
type Day int
func (d Day) String() string {
names := []string{"Mon", "Tue", "Wed"}
return names[d]
}
func main() {
fmt.Println(Day(1))
}見やすく出力される列挙型
iotaとStringerを組み合わせると、定数を数値ではなく読みやすい名前で出力できます。
package main
import "fmt"
type State int
const (
Idle State = iota
Running
Done
)
func (s State) String() string {
return []string{"Idle", "Running", "Done"}[s]
}
func main() {
fmt.Println(Running)
}値レシーバーとポインタレシーバー
String()が値レシーバーを使用している場合、値とポインタの両方が見やすく出力されます。ポインタレシーバーを使用すると、ポインタの場合だけこのメソッドが呼び出されます。
package main
import "fmt"
type Tag struct{ Name string }
func (t Tag) String() string { return "#" + t.Name }
func main() {
t := Tag{"go"}
fmt.Println(t)
fmt.Println(&t)
}無限再帰を避ける
型自身のString()内で、同じ型に対してfmt.Sprintf("%v", t)を呼び出してはいけません。これによりString()が永久に再び呼び出されます。フィールドを直接整形してください。
package main
import "fmt"
type Money struct{ Cents int }
func (m Money) String() string {
return fmt.Sprintf("$%.2f", float64(m.Cents)/100)
}
func main() {
fmt.Println(Money{1050})
}スライス内でStringerを使う
Stringerを実装した値のスライスを出力すると、各要素はそのString()メソッドで整形されます。
package main
import "fmt"
type Tag struct{ Name string }
func (t Tag) String() string { return "#" + t.Name }
func main() {
tags := []Tag{{"go"}, {"web"}}
fmt.Println(tags)
}インターフェースとして使う
任意のStringerをfmt.Stringer型の変数に格納し、インターフェース経由でString()を呼び出せます。
package main
import "fmt"
type City struct{ Name string }
func (c City) String() string { return "City of " + c.Name }
func main() {
var s fmt.Stringer = City{"Oslo"}
fmt.Println(s.String())
}重要な理由
Stringerを実装すると、型を出力またはログに記録する場所ならどこでも、追加の整形コードなしに見やすい出力を得られます。
package main
import "fmt"
type Temp float64
func (t Temp) String() string {
return fmt.Sprintf("%.1f°C", float64(t))
}
func main() {
fmt.Println(Temp(21.5))
}確認問題
fmt.Stringerを満たすために、型はどのメソッドを定義する必要がありますか。
まとめ:Stringerインターフェース
出力をカスタマイズする方法を学びました。
String() stringを実装すると、fmt.Stringerを満たします。fmtは%vと%sに対して自動的に呼び出します。- 列挙型に適していますが、同じ型に対する再帰的な
%vは避けてください。
package main
import "fmt"
type Level int
func (l Level) String() string {
return []string{"low", "mid", "high"}[l]
}
func main() {
fmt.Println(Level(2))
}よくある質問
「Stringerインターフェース」レッスンは無料ですか?
はい。「Stringerインターフェース」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「Stringerインターフェース」で何を学びますか?
型の表示方法をカスタマイズします ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「Stringerインターフェース」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Printfの動詞
- SprintfとFprintf
- Stringerインターフェース
- 入力のスキャン