Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah fungsi generik berinteraksi dengan fungsi bukan generik sedia ada di Golang?

Bagaimanakah fungsi generik berinteraksi dengan fungsi bukan generik sedia ada di Golang?

PHPz
PHPzasal
2024-04-16 17:36:01610semak imbas

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.

Bagaimanakah fungsi generik berinteraksi dengan fungsi bukan generik sedia ada di Golang?

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

🎜Guna antara muka kosong🎜🎜🎜Antara muka kosong boleh mewakili sebarang jenis pembolehubah. Ini membolehkan kami mencipta fungsi generik yang menerima atau mengembalikan sebarang jenis nilai: 🎜rrreee🎜 Kita boleh memanggil fungsi ini dengan sebarang jenis nilai: 🎜rrreee🎜🎜 Contoh Praktikal: Melaksanakan Isih Generik 🎜🎜🎜 Mari kita susun senarai dengan Untuk menunjukkan interaksi antara kod generik dan kod bukan generik. 🎜rrreee🎜Kod ini menunjukkan cara menggunakan fungsi generik 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!

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