Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bila hendak menggunakan ~[]E vs []E untuk Slice Arguments dalam Go?

Bila hendak menggunakan ~[]E vs []E untuk Slice Arguments dalam Go?

DDD
DDDasal
2024-10-24 04:23:02689semak imbas

When to Use ~[]E vs []E for Slice Arguments in Go?

Meneroka Kehalusan Argumen Slice Generik

Pertimbangkan dua fungsi daripada pakej kepingan eksperimen: Mengandungi dan Tumbuh. Kedua-dua fungsi menerima hujah hirisan, tetapi dengan kekangan jenis yang berbeza:

Kekangan Jenis

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.

Implikasi Praktikal

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.

Kepentingan Parameter Jenis Kekangan Slice

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.

Demonstrasi dengan Grow

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.

Contoh

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.

Kesimpulan

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn