0Pricing
Go Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Printfの動詞
  2. SprintfとFprintf
  3. Stringerインターフェース
  4. 入力のスキャン
← Go Academyに戻る