在 golang 1.18 中,我想定義如下函式:
func Pipe[A, T1, T2 any](left func(A) T1, right func(T1) T2) func(A) T2 {
return func(a A) T2 {
return right(left(a))
}
}
例如,函式的輸出left
應該是函式的輸入right
,表示為泛型。
我注意到對于以下示例,這無法按預期作業:
func OpenFile(name string) *os.File {
...
}
func ReadAll(rdr io.Reader) []byte {
...
}
var OpenRead = Pipe(OpenFile, ReadAll)
這無法編譯,因為編譯器認為T1
是*os.File
并且雖然它兼容io.Reader
但并不相同。
如果我要呼叫沒有模板的鏈,如下所示:
var result = ReadAll(OpenFile("test"))
然后編譯器識別兼容的型別。
問題:
- golang 1.18 泛型中有沒有辦法修復簽名
Pipe
以允許所需的行為? - golang 1.18 的行為是設計的還是這是一個錯誤?
uj5u.com熱心網友回復:
- 不。
- 不,不是錯誤。請參閱常見問題解答。
鑒于 Go 不支持協變結果型別,您需要將 的結果轉換left
為right
. 然而,目前沒有辦法使用型別引數來表達可轉換性。
如果您愿意,您可以根據該鏈接中的示例調整您的代碼,您會得到類似的東西,但請記住,它不是“編譯時型別安全的”。
func Pipe[A, T1, T2, T3 any](left func(A) T1, right func(T2) T3) func(A) T3 {
return func(a A) T3 {
return right((interface{})(left(a)).(T2))
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/470409.html