首頁 >後端開發 >Golang >從函數傳回切片時,切片約束如何影響類型保留?

從函數傳回切片時,切片約束如何影響類型保留?

Patricia Arquette
Patricia Arquette原創
2024-10-23 15:45:02844瀏覽

When Returning Slices from Functions, How Do Slice Constraints Affect Type Preservation?

通用切片參數與切片類型約束

在Go 的實驗性切片包中,兩個函數Contains 和Grow 接受不同類型的參數限制。 Contains 採用通用 []E 類型,而 Grow 將其參數類型限制為切片 (~[]E)。

型別約束

型別約束,以 ~ 表示,確保型別符合特定的介面或規則集。在 Grow 中,~[]E 約束強制參數類型最終必須是元素類型為 E 的切片。

等效功能?

儘管類型約束不同,兩個函數中可用的操作看起來幾乎相同。然而,當函數必須傳回與輸入參數相同類型的切片時,就會出現一個關鍵的實際差異。

返回切片

當返回相同類型的切片時作為輸入,使用像 ~[]E 這樣的類型約束至關重要。這允許函數保留輸入切片的命名類型。

考慮Grow() 的兩個版本:

// Preserves named type
func Grow[S ~[]E, E any](s S, n int) S {...}

// Returns unnamed type
func Grow2[E any](s []E, n int) []E {...}

如果Grow() 接收自訂切片類型,它可以傳回相同類型的切片,而Grow2() 將始終傳回未命名的切片。

示範

type MyInts []int
x := MyInts{1} // Custom slice type
x2 := Grow(x, 10) // Type preserved
x3 := Grow2(x, 10) // Unnamed type

在此範例中,x2 將是輸入 MyInts,而 x3 將是一個未命名的切片。

結論

當您需要在回傳值中保留輸入切片的命名類型時,這是必要的使用類似 ~[]E 的類型約束。否則,傳回的切片將始終是未命名類型。

以上是從函數傳回切片時,切片約束如何影響類型保留?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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