😎

golangでinterfaceを満たすメソッドを実装してみる

2020/09/19に公開

これは何?

interface の説明をするために A Tour of Go を見返していたらクイズがあったので答えを考えてみました。

ネタバレとなってしまうので、最初に答えを考えた上で本記事を参照してください。

問題: Stringerを満たすIPAddrを実装せよ

今回取り組んだ問題は こちらExercise: Stringers です。
前のページで、 One of the most ubiquitous interfaces is Stringer defined by the fmt package. (Stringerは最もよくみられるinterfaceの一つで、fmt パッケージで定義されています。)という紹介があり、本問題へとつながります。

package main

...

type IPAddr [4]byte

// TODO: Add a "String() string" method to IPAddr. // ←これを実装する
...

func main() {
	hosts := map[string]IPAddr{
		"loopback":  {127, 0, 0, 1},
		"googleDNS": {8, 8, 8, 8},
	}
	for name, ip := range hosts {
		fmt.Printf("%v: %v\n", name, ip) 
   // すると、ここでString()関数が呼ばれるため、
   // 出力が下記となればOK
	 // 
   // loopback: 127.0.0.1
   // googleDNS: 8.8.8.8
	}
}

答え

答えを見たい方はここ↓をみてください。実行もできます。

https://play.golang.org/p/_2oNcz7V_Az

解説

fmt.Printでは、引数がStringerインターフェース を満たす型の場合はString()メソッドの結果を出力します。

したがって、Stringメソッド実装有無によって出力結果が変わったわけです。

まとめ

golangを勉強するには、A Tour of Go を含む公式サイトが充実しているので都度参照するとよいです。
そのうち、ちゃんとinterfaceについての説明を記事にしたいです。

Discussion