A Tour of Goの練習問題を解説するシリーズ(5/11) – Exercise: Stringers

みなさん、こんにちは。人類をGopherにしたいと考えているまるりんです。

A Tour of Goはプログラミング言語Goの入門サイトです。 このシリーズではA Tour of Goの練習問題を解説します。

今回は以下の問題を扱います。

問題
Exercise: Stringers
解答
https://go.dev/play/p/WE4RW-rZ7yA


この問題はサービス問題だなと思い、前ページを参考に解いてみました。

ソース
https://go.dev/play/p/cO4P326HHcH

実行結果

loopback: [127 0 0 1]
googleDNS: [8 8 8 8]

String()を実装したにもかかわらず、出力がそれを通っていないようです。 とりあえずレシーバをポインタではない型にしてみました。

ソース
https://go.dev/play/p/WE4RW-rZ7yA

実行結果

loopback: 127.0.0.1
googleDNS: 8.8.8.8

今度は想定通りの動きになりました。なぜでしょうか。 検証するためにfmt.Printf()を真似たミニマムなコードを書いてみました。

ソース
https://go.dev/play/p/Y8H51W6qMPA

実行結果

array: [127 0 0 1]
ptr: 198.0.0.1

要はこの違いです。 当たり前のことですが、レシーバの型を*IPAddrにした場合、型*IPAddrはString()インタフェースを実装していますが、型IPAddrはString()インタフェースを実装していません。 そのため変数ip[0]case fmt.Stringer:と一致せず(インタフェースを実装していないので)配列のような形の出力([127 0 0 1])になっています。

疑問を解消できました。さらに型を意識していきたいところです。