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])になっています。
疑問を解消できました。さらに型を意識していきたいところです。