Pertimbangkan dua fungsi daripada pakej kepingan eksperimen: Mengandungi dan Tumbuh. Kedua-dua fungsi menerima hujah hirisan, tetapi dengan kekangan jenis yang berbeza:
Argumen pertama Contains mempunyai jenis []E, di mana E dikekang oleh sebanding, menunjukkan bahawa E mesti boleh dibandingkan . Sebaliknya, hujah pertama Grow mempunyai jenis S, dikekang oleh ~[]E, menunjukkan bahawa S mesti mempunyai jenis asas iaitu sepotong E.
Pada pandangan pertama, nampaknya tiada perbezaan praktikal antara menggunakan kedua-dua jenis kekangan ini. Walau bagaimanapun, ini tidak berlaku apabila anda perlu memulangkan sekeping jenis yang sama seperti hujah dalam Grow.
Jika anda perlu kembali sekeping jenis yang sama dengan hujah input, anda mesti menggunakan parameter jenis yang sendiri mengekang sekeping (cth., ~[]E). Ini membenarkan fungsi mengembalikan nilai jenis yang sama seperti hujah.
Mari kita pertimbangkan dua pelaksanaan Grow:
func Grow[S ~[]E, E any](s S, n int) S // Grow returns a slice of the same type as s func Grow2[E any](s []E, n int) []E // Grow2 returns a slice of type []E
Apabila lulus kepingan jenis tersuai dengan kepingan sebagai jenis asasnya, Grow boleh mengembalikan nilai jenis yang sama, manakala Grow2 tidak boleh. Grow2 hanya boleh mengembalikan nilai jenis kepingan yang tidak dinamakan, []E.
type ints []int // user-defined slice type ints x := []int{1} // initialize a slice x of type []int x2 := Grow(x, 10) // x2 will be of type []int y := ints{1} // initialize a slice y of type ints y2 := Grow(y, 10) // y2 will be of type ints
Di sini, Grow2(y, 10) menerima nilai jenis int tetapi mengembalikan nilai daripada jenis []int, yang bukan tingkah laku yang dimaksudkan.
Kesimpulannya, apabila panggilan fungsi memerlukan mengembalikan kepingan yang sama (mungkin dinamakan) taip sebagai argumen, menggunakan parameter jenis yang sendiri mengekang keping (~[]E) adalah perlu. Jika tidak, parameter jenis yang mengekang hanya jenis elemen (E any) boleh digunakan.
Atas ialah kandungan terperinci Bila hendak menggunakan ~[]E vs []E untuk Slice Arguments dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!