Dalam Go, kesatuan mempunyai dua tujuan utama:
Walau bagaimanapun, ia adalah penting untuk ambil perhatian bahawa kesatuan hanya boleh digunakan dalam kekangan antara muka. Cuba untuk menggunakannya sebagai jenis biasa, seperti dalam tt := []testDifference[intOrString], tidak disokong.
Selain itu, bekas generik, seperti hirisan, tidak boleh memuatkan item daripada jenis yang berbeza. Walaupun kepingan ujian anda termasuk kedua-dua testDifference[int ] dan testDifference[rentetan], instantiasi konkrit ini adalah jenis yang berbeza.
Untuk menyelesaikannya, anda boleh sama ada menggunakan kepingan berasingan untuk setiap jenis (ttInts dan ttStrs) atau simpan semua item sebagai antara muka ([]antara muka{}).
Operasi pada kekangan kesatuan terhad kepada yang disokong oleh semua jenis dalam set jenis. Dalam kes int | rentetan, ini termasuk pengisytiharan pembolehubah, penukaran, perbandingan, pesanan dan pengendali.
Contoh:
type intOrString interface { int | string } func beforeIntOrString[T intOrString](a, b T) bool { return a < b } func sumIntOrString[T intOrString](a, b T) T { return a + b } func main() { fmt.Println(beforeIntOrString("foo", "bar")) // false fmt.Println(beforeIntOrString(4, 5)) // true fmt.Println(sumIntOrString("foo", "bar")) // foobar fmt.Println(sumIntOrString(10, 5)) // 15 }
Dalam contoh ini, beforeSendIntOrString dan sumIntOrString ialah fungsi generik yang berfungsi dengan nilai int dan rentetan, masing-masing.
Atas ialah kandungan terperinci Bagaimanakah Go Generik Mengendalikan Kesatuan dan Hadnya dalam Kekangan Jenis dan Bekas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!