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

PHPz
Lepaskan: 2024-04-16 17:36:01
asal
623 orang telah melayarinya

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"
    }
}
Salin selepas log masuk

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) {}
Salin selepas log masuk

Kini, kita boleh menggunakan jenis bukan generik MyString di dalam fungsi generik GenericFunc: MyString 在泛型函数 GenericFunc 中:

GenericFunc(MyString("Hello"))
Salin selepas log masuk

使用空的接口

空的接口可以表示任何类型的变量。这允许我们创建接受或返回任何类型值的泛型函数:

func GenericEmptyInterfaceFunc(empty interface{}) {}
Salin selepas log masuk

我们可以使用任何类型的值调用此函数:

GenericEmptyInterfaceFunc(10)
GenericEmptyInterfaceFunc("Hello")
Salin selepas log masuk

实战案例:实现泛型排序

让我们通过对列表进行排序来演示泛型代码与非泛型代码的交互。

// 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]
}
Salin selepas log masuk

此代码演示了如何使用泛型函数 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!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan