編譯時檢查型別是否滿足介面
介面和實現(實現介面的型別)是分離的。因此,如果型別實現介面,如何在編譯時檢查是一個合法的問題。
要求編譯器檢查 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 中: 我如何保證我的型別滿足介面?