使用しない変数をインターフェース型で宣言する意味と、io.Discard に関する質問
io.Discard
の ソースコード を見ていて疑問点が2点あります。
Q1.
Goの基本的な文法に関する質問になってしまいますが、以下は何を意図しているのでしょうか。
// devNull implements ReaderFrom as an optimization so io.Copy to
// ioutil.Discard can avoid doing unnecessary work.
var _ io.ReaderFrom = devNull(0)
コード内のコメントから、devNull
が io.Copy
で使われる場合に備えて「io.ReaderFrom
インタフェースを実装している」ことを宣言しているのだろうとは思うのですが、一体どういう理屈で上記がインタフェースを実装していることの宣言になるのでしょうか(そういう文法なのだと言われるとそれまでなのですが…)。
Q2.
以下のように WriteString
関数が定義されていますが、
func (devNull) WriteString(s string) (int, error) {
return len(s), nil
}
そもそも io.Discard
は ioutil
パッケージに io.Writer
型の変数として宣言されているため、
// Discard is an io.Writer on which all Write calls succeed
// without doing anything.
var Discard io.Writer = devNull(0)
例えば以下のように呼び出すことはできません。
ioutil.Discard.WriteString("hoge")
// ビルドエラー:
// ioutil.Discard.WriteString undefined
// (type io.Writer has no field or method WriteString)
一体なんのために存在しているのでしょうか。