編譯時檢查型別是否滿足介面

介面和實現(實現介面的型別)是分離的。因此,如果型別實現介面,如何在編譯時檢查是一個合法的問題。

要求編譯器檢查 T 型別實現介面 I 的一種方法是嘗試使用 T 的零值或 T 的指標進行賦值。我們可以選擇分配空白識別符號以避免不必要的垃圾:

type T struct{}

var _ I = T{}       // Verify that T implements I.
var _ I = (*T)(nil) // Verify that *T implements I.

如果 T*T 沒有實現 I,那將是編譯時錯誤。

這個問題也出現在官方 FAQ 中: 我如何保證我的型別滿足介面?