首頁  >  文章  >  後端開發  >  Go 1.18 泛型可以處理函數簽章中的逆變型別嗎?

Go 1.18 泛型可以處理函數簽章中的逆變型別嗎?

Susan Sarandon
Susan Sarandon原創
2024-11-17 10:50:021002瀏覽

Can Go 1.18 Generics Handle Contravariant Types in Function Signatures?

Go 1.18 中具有逆變類型的泛型:澄清和限制

在Go 1.18 中使用泛型定義一個函數的努力,函數接受兩個函數相容但不相同的類型(一種逆向行為)遇到了挑戰。讓我們深入研究細節以了解原因。

考慮以下函數定義:

此函數旨在將左側函數的輸出透過管道傳輸到右側函數,從而連結計算。但是,當嘗試將其與以下範例一起使用時:

編譯失敗。這是因為編譯器期望 T1 與 *os.File 相同,即使它與 io.Reader 相容。雖然期望相容類型被接受似乎是合理的,但由於 Go 缺乏對協變結果類型的支持,情況並非如此。

有沒有辦法在 Go 1.18 修復此簽名?

不幸的是,沒有。 Go 的泛型目前缺乏使用類型參數表達類型可轉換性的能力,因此無法修改 Pipe 函數以允許這種行為。

這是 Go 1.18 的錯誤嗎?

沒有。正如官方常見問題解答中所述,此行為是故意的,不被視為錯誤。

解決方法

要得到類似的結果,可以手動實現轉換步驟:

但是,需要注意的是,這種方法不提供編譯時類型安全性。

以上是Go 1.18 泛型可以處理函數簽章中的逆變型別嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn