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