Dalam Go, fungsi generik boleh berinteraksi dengan kod bukan generik dengan menggunakan penegasan jenis, jenis alias atau antara muka kosong. Penegasan jenis membenarkan nilai ditukar kepada jenis jenis tertentu membuat alias generik jenis sedia ada dan antara muka kosong boleh mewakili sebarang jenis; Melalui kaedah ini, fungsi generik boleh menerima atau mengembalikan nilai jenis bukan generik, membolehkan pemprosesan data merentas jenis yang berbeza.
Cara membuat fungsi generik berinteraksi dengan fungsi bukan generik dalam Go
Go telah memperkenalkan generik sejak Go 1.18, membuka pintu kepada penggunaan semula jenis dan kod algoritma. Tetapi bagaimanakah kod generik baharu berinteraksi dengan kod bukan generik sedia ada?
Menggunakan Jenis Penegasan
Jenis penegasan menyediakan cara untuk menukar antara muka kepada nilai jenis tertentu. Ini boleh dilakukan menggunakan pernyataan suis:
func AnyToString(any interface{}) string { switch myString := any.(type) { case string: return myString default: return "Unknown" } }
Fungsi ini cuba menukar nilai arbitrari kepada rentetan, mengembalikan "Tidak diketahui" jika ia bukan rentetan.
Menggunakan alias jenis
Alias jenis membolehkan anda mencipta alias untuk jenis sedia ada. Ini membolehkan kami mencipta alias generik untuk jenis bukan generik:
type MyString string func GenericFunc[T MyString](t T) {}
Kini, kita boleh menggunakan jenis bukan generik MyString
di dalam fungsi generik GenericFunc
: MyString
在泛型函数 GenericFunc
中:
GenericFunc(MyString("Hello"))
使用空的接口
空的接口可以表示任何类型的变量。这允许我们创建接受或返回任何类型值的泛型函数:
func GenericEmptyInterfaceFunc(empty interface{}) {}
我们可以使用任何类型的值调用此函数:
GenericEmptyInterfaceFunc(10) GenericEmptyInterfaceFunc("Hello")
实战案例:实现泛型排序
让我们通过对列表进行排序来演示泛型代码与非泛型代码的交互。
// Sort is a generic function that sorts a slice of any type that implements sort.Interface. func Sort[T sort.Interface](s []T) { sort.Sort(s) } // IntSlice implements sort.Interface for a slice of int. type IntSlice []int func (s IntSlice) Len() int { return len(s) } func (s IntSlice) Less(i, j int) bool { return s[i] < s[j] } func (s IntSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } // StringSlice implements sort.Interface for a slice of string. type StringSlice []string func (s StringSlice) Len() int { return len(s) } func (s StringSlice) Less(i, j int) bool { return s[i] < s[j] } func (s StringSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } func main() { intSlice := IntSlice{10, 5, 7, 3, 11} Sort(intSlice) fmt.Println(intSlice) // Output: [3 5 7 10 11] stringSlice := StringSlice{"Hello", "World", "Go", "Golang"} Sort(stringSlice) fmt.Println(stringSlice) // Output: [Go Golang Hello World] }
此代码演示了如何使用泛型函数 Sort
rrreee
Isih
untuk mengisih senarai nilai yang berbeza berdasarkan jenis tersuai. 🎜Atas ialah kandungan terperinci Bagaimanakah fungsi generik berinteraksi dengan fungsi bukan generik sedia ada di Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!