在 Go 的實驗包切片中,兩個函數 Contains 和 Grow 的第一個參數具有不同的類型參數。 Contains 接受可比較元素的切片 ([]E),而 Grow 接受限制為切片類型的參數 (~[]E)。
實際注意事項
而這些聲明在實踐中可能看起來是等效的,但當您需要返回與輸入參數相同類型的切片時,它們會有所不同。
何時使用 ~[]E 類型參數
當您必須傳回與參數類型相同(可能命名)的切片時,請使用 ~[]E。例如,如果您想要建立一個產生特定命名類型切片的泛型函數:
<code class="go">func Grow[S ~[]E, E any](s S, n int) S { // ... }</code>
何時使用[]E 類型參數
當不需要傳回切片或可以接受返回未命名切片時,請使用[]E:
<code class="go">func Contains[E comparable](s []E, v E) bool { // ... }</code>
示範
考慮Grow 的兩種實作():
<code class="go">// Using ~[]E func Grow[S ~[]E, E any](s S, n int) S { // ... } // Using []E func Grow2[E any](s []E, n int) []E { // ... }</code>
當傳遞自訂切片類型(以切片作為其基礎類型)時,Grow() 可以傳回相同類型的值,而Grow2() 不能傳回一個未命名的切片type.
輸出:
x2 []int len=1 cap=12 x3 []int len=1 cap=12 y2 main.ints len=1 cap=12 y3 []int len=1 cap=12
如上所示,Grow2(y, 10) 傳回意外類型的切片,這可能是不可取的。
以上是何時在 Go 中使用 ~[]E 和 []E 類型參數作為切片參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!