首頁  >  文章  >  後端開發  >  為什麼 Go 函數不能傳回有約束類型參數的型別?

為什麼 Go 函數不能傳回有約束類型參數的型別?

WBOY
WBOY轉載
2024-02-09 15:06:09907瀏覽

为什么 Go 函数不能返回带有约束类型参数的类型?

為什麼Go函數不能回傳帶有約束類型參數的型別?這是一個經常引發疑惑的問題。在Go語言中,函數的傳回類型不能是具有約束類型參數的類型,這主要是由於Go語言對泛型的支援較為有限所導致的。在Go語言中,沒有類似Java或C#中的泛型機制,也沒有支援約束類型參數的語法。因此,函數的傳回類型只能是具體的類型,無法使用約束類型參數。這意味著我們無法在函數中定義一個參數類型為約束類型的傳回類型。這樣的限制可能會使得某些場景下的程式碼編寫變得稍微麻煩,但也是Go語言設計的一部分。

問題內容

在嘗試在go 中的編譯時強制執行有效狀態轉換的問題時,我遇到了函數無法返回具有非具體類型參數的泛型類型的限制,如此處所述問題。無法建置的 mre(go playground 連結):

type mystruct[t any] struct {
    myfield t
}

func returnconstrainedgeneric[t any]() mystruct[t] {
    return mystruct[int]{
        myfield: 1,
    }
}

編譯器回傳錯誤 cannot use mystruct[int]{…} (value of type mystruct[int]) as mystruct[t] value in return statements.

連結的問題給了這樣的推理:

The error occurs because operations that involve a type parameter (including assignments and returns) must be valid for all types in its type set.

它概述了包括類型斷言在內的幾個解決方法,但我很好奇為什麼存在此限制。天真地,在我的範例中,我希望從returnconstrainedgeneric() 傳回mystruct[int] 類型的值是有效的,因為int# 滿足any 的型別約束。我希望returnconstrainedgeneric() 的呼叫者不知道回傳值的型別是mystruct[int],它只知道它是mystruct[t],其中t 滿足any 約束。我的推理中缺少什麼?這是 go 如何實現泛型/類型約束的根本問題,還是 go 編譯器目前實現的問題,還是其他問題?

解決方法

這是無效的,因為語法意味著

x:=returnconstrainedgeneric[string]()
// x is mystruct[string]

但是您正在嘗試返回 mystruct[int]

您推理中的缺陷是您在實例化函數時指定了函數的傳回類型。函數無法傳回滿足 any 限制的類型,它傳回實例化的類型。換句話說,實例化函數的 t 必須與 mystruct[t] 中的 t 相同。

如果您總是回傳 mystruct[int],請這樣宣告:

func returnconstrainedgeneric[t any]() mystruct[int] {...}

或者,如果函數根本不使用 t

func returnConstrainedGeneric() MyStruct[int] {...}

以上是為什麼 Go 函數不能傳回有約束類型參數的型別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除