Go 1.18 中具有逆變類型的泛型:澄清和限制
在Go 1.18 中使用泛型定義一個函數的努力,函數接受兩個函數相容但不相同的類型(一種逆向行為)遇到了挑戰。讓我們深入研究細節以了解原因。
考慮以下函數定義:
此函數旨在將左側函數的輸出透過管道傳輸到右側函數,從而連結計算。但是,當嘗試將其與以下範例一起使用時:
編譯失敗。這是因為編譯器期望 T1 與 *os.File 相同,即使它與 io.Reader 相容。雖然期望相容類型被接受似乎是合理的,但由於 Go 缺乏對協變結果類型的支持,情況並非如此。
有沒有辦法在 Go 1.18 修復此簽名?
不幸的是,沒有。 Go 的泛型目前缺乏使用類型參數表達類型可轉換性的能力,因此無法修改 Pipe 函數以允許這種行為。
這是 Go 1.18 的錯誤嗎?
沒有。正如官方常見問題解答中所述,此行為是故意的,不被視為錯誤。
解決方法
要得到類似的結果,可以手動實現轉換步驟:
但是,需要注意的是,這種方法不提供編譯時類型安全性。
以上是Go 1.18 泛型可以處理函數簽章中的逆變型別嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!