Stringerで構造体の出力結果をカスタマイズしよう!

Go言語
この記事は約5分で読めます。
Go初学者
Go初学者

構造体の出力結果をカスタマイズする方法ってあるのかな?

この記事では構造体の出力結果をカスタマイズする方法を理解できます!
  • stringerを使って構造体の出力結果をカスタマイズできます
  • Sprintf関数について理解できます

今回は構造体の出力結果をカスタマイズして、あなた好みの出力結果を表示してみましょう。

そして、fmtパッケージの Sprintf() 関数についても理解していきます。

もりぴ
この記事を書いた人

XHTML1.0時代にHTML&CSSを勉強した経験あり。無趣味だった私が2020年5月からプログラミング学習を開始し現在も挫折せずに趣味で学習を楽しんでいる51歳。プログラミングの楽しさをブログを通してお伝えしていきます。

もりぴをフォローする

Go言語の構造体の出力結果をカスタマイズする

Go言語の構造体の出力結果をカスタマイズするには、fmtパッケージで定義されている Stringer を活用していきます。

Stringerとは?

Stringer はfmtパッケージで定義されたインターフェースで、文字列に関する出力結果を自由にカスタマイズできる機能を持っています。

では、fmtパッケージではどのように定義されているのでしょうか。

// fmtパッケージで定義されているStringer
type Stringer interface {
    String() string
}

StringerString() 関数をメソッドとして使用することで、Stringer を使うことができます。

最初に出力結果がカスタマイズされていない状態を確認

まずは、出力結果をカスタマイズしていない状態を確認してみましょう。

// 出力結果がカスタマイズされていない状態
package main

import "fmt"

type Member struct {
    Name string
    Age  int
}

func main() {
    user1 := Member{
	Name: "もりぴ",
	Age:  51,
    }
    fmt.Println(user1)
}
// 出力結果
$ go run main.go 
{もりぴ 51}
もりぴ
もりぴ

よく見かける、普通の出力結果ですね。

Stringerを使用してカスタマイズした場合

では、Stringer を使用してカスタマイズします。

先程、説明した通り String() を使用することで Stringer を実装することができます。

// Stringerを使用してカスタマイズ
package main

import "fmt"

type Member struct {
    Name string
    Age  int
}

// String()をメソッドとして使用しStringerを実装
func (a Member) String() string {
    return fmt.Sprintf("私の名前は%vで、年齢は%vです。", a.Name, a.Age)
}

func main() {
    user1 := Member{
	Name: "もりぴ",
	Age:  51,
    }
    fmt.Println(user1)
}
// 出力結果
$ go run main.go 
私の名前はもりぴで、年齢は51です。

main関数fmt.Println(user1) はそのままに、出力結果がカスタマイズされて表示されているのが確認できます。

POINT

レシーバーで構造体 MemberString() をメソッドにすることで、fmt.Println(user1) が実行される段階で String() の戻り値が表示されます。

Go初学者
Go初学者

なんか不思議な感じですね!

例えば、構造体にデータとして収めておいても良いけれど、出力結果として表示したくない場合にも応用できます。

もりぴ
もりぴ

私の年齢隠してもらえないかな!!

// Stringerを使用してカスタマイズ
package main

import "fmt"

type Member struct {
    Name string
    Age  int
}

// String()をメソッドとして使用しStringerを実装
func (a Member) String() string {
    return fmt.Sprintf("私の名前は%vです。", a.Name)
}

func main() {
    user1 := Member{
	Name: "もりぴ",
	Age:  51,
    }
    fmt.Println(user1)
}
// 出力結果
$ go run main.go 
私の名前はもりぴです。

という感じで、自由にカスタマイズできます。

Sprintf()関数とは?

Go初学者
Go初学者

先程のプログラムの Sprintf() って見たことないけど…

当ブログで出力に使用していたのは、fmtパッケージの Println()Printf() でした。

先程のプログラムで使用していた Sprintf() 関数とは、いったいどんな関数なのでしょう。

Sprintf() 関数はfmtパッケージで用意され Printf() 関数と同様に書式指定子を用いて出力する関数です。

Printf() 関数との違いは Printf() 関数は画面などに出力しますが、Sprintf() 関数は変数に代入したり関数の戻り値などへstringとして出力します。

なので、先程のプログラムの戻り値として string が指定されています。

// 戻り値がstringであることを確認
func (a Member) String() string {
    return fmt.Sprintf("私の名前は%vです。", a.Name)
}

【まとめ】Go言語の構造体の出力結果をカスタマイズする

それでは、まとめにはいります。

この記事で押さえておくこと!
  • 文字列型の出力結果を自由にカスタマイズする方法として Stringer がある
  • Sprintf() 関数は変数に代入したり関数の戻り値などへstring型として出力する

今回は Stringer を利用して構造体の出力結果をカスタマイズしましたが、Stringer は他にも文字列型の出力結果を自由に変更したい場面で使用できます。

Go言語のパッケージにはまだまだ便利な定義が用意されています。

私もそうなんですが…Go言語のプログラムを書いて徐々に覚えていきましょう。

もりぴ
もりぴ

私が勉強したパッケージの関数はブログで共有していきます!

comment

タイトルとURLをコピーしました