在Go 中,使用類型參數定義泛型介面可能會導致實施和使用時的推理問題。本文解決了這種情況下的錯誤「無法推斷 V:從約束實現推斷類型參數」。
考慮一個帶有類型參數 K 和 V 的介面 ConfigStorage,其中 V 擴展了 WritableType 。定義了此介面的檔案系統儲存實作 FileSystemStorage。然而,當嘗試使用泛型函數 GetValue 時,由於無法推斷 V 的類型,會出現編譯錯誤。
Go 1.21 及更高版本:
此問題在Go 1.21 及更高版本中已解決,因為類型推論已推斷得到增強,可以考慮介面中的方法簽名。方法簽章中類型參數的型別參數可以從對應方法中的匹配參數推斷出來。
要在不指定類型約束的情況下使用GetValue:
轉到1.20 及更低版本:
對於早期的Go 版本,不支援從實作約束的類型推斷V。呼叫GetValue 時必須提供明確類型參數:
出現錯誤是因為函數GetValue 嘗試從提供的參數推斷V 的類型:其第一個參數,存儲,及其第二個參數key。然而,這些參數本身並不能提供足夠的資訊來確定 V,因為儲存是一個可以實現多種類型的介面值。
明確指定型別參數可以消除編譯器的歧義。它允許類型推斷演算法根據提供的參數推斷出 V 的正確類型。
以上是如何解決Go通用介面中的「無法推斷V:從約束實現推斷類型參數」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!