Overview
ライブラリのコードを読んでいたところ、
var _ Setter = (*Cmd)(nil)
こんなコードがあったので、effective goをもとに、なんの意味があるのか確認。
Detail
Interface Checks のセクションに記載がある。
-
Cmd
structが、Setter
interfaceを満たしているか確認。もしSetter
の実装が変わりCmd
の実装も変更していないと、var _ Setter = (*Cmd)(nil)
の部分でcompilerによりエラーになりSetter
の実装が変わったことが気づける。 - blank identifier(
var _ Setter
) にする理由は、setter
にキャストする(*Cmd)(nil)
を使わないため。そのためcompilerのエラーをださせないので、blank identifierとなっている。 -
(*Cmd)(nil)
これは、interfaceの要求を満たしているかチェックするためだけなので、新たにメモリを確保する必要がない、というかする意味がないので、nil
を*Cmd
にキャストしている。