Rumah > pembangunan bahagian belakang > Golang > Penerokaan awal generik dalam Go1.18

Penerokaan awal generik dalam Go1.18

Lepaskan: 2023-07-24 15:00:40
ke hadapan
915 orang telah melayarinya

Fungsi yang ingin kami laksanakan hari ini ialah: jumlahkan semua nilai dalam peta.

Fungsi bukan generik

Bagaimana untuk melaksanakannya tanpa generik? Kerana nilai mungkin mempunyai jenis yang berbeza, seperti: int64, float64, dll., tanpa generik, jenis yang berbeza perlu dilaksanakan melalui fungsi yang berbeza, jadi kami secara amnya melaksanakannya seperti berikut:

func SumInts(m map[string]int64) int64 {
    var s int64
    for _, v := range m {
        s += v
    }
    return s
}

func SumFloats(m map[string]float64) float64 {
    var s float64
    for _, v := range m {
        s += v
    }
    return s
}
Salin selepas log masuk

Dalam kod di atas, kami mentakrifkan Terdapat dua fungsi:

1. SumInts() mengira jumlah nilai sebagai jenis int64; masih mahu Untuk mengira int, float32, dll., anda perlu menyalin fungsi di atas sekali lagi dan mengubah suai jenisnya.

Adakah ia sedikit menyusahkan untuk melakukan ini, dan kod itu sangat kembung? Apatah lagi, terdapat banyak kod yang serupa dalam pakej standard sebelum ini, seperti pakej Sort (sort.go) perpustakaan standard. Untuk mencapai pengisihan jenis kepingan yang berbeza, ia ditakrifkan IntSlice, Float64Slice, StringSlice.

Oleh kerana versi Go sebelum ini tidak menyokong generik, ia hanya boleh dilaksanakan dengan cara ini, yang juga merupakan kaedah paling mudah.

Dengan generik, bagaimanakah kita boleh melaksanakan fungsi untuk mengira jumlah nilai untuk pelbagai jenis int64 dan float64?

Fungsi generikDalam bahagian ini, kami menggunakan fungsi generik untuk melaksanakan peta yang nilainya jenis int64 sebagai parameter, atau peta yang nilainya jenis float64 sebagai parameter.

Kod lengkap adalah seperti berikut:

func Sum[K comparable, V int64 | float64](m map[K]V "K comparable, V int64 | float64") V {
 var s V
 for _, v := range m {
  s += v
 }
 return s
}

func main() {
 ints := map[string]int64{
  "first":  1,
  "second": 2,
 }
 fmt.Println(Sum[string, int64](ints "string, int64"))

 floats := map[string]float64{
  "first":  35.98,
  "second": 26.99,
 }
 fmt.Println(Sum[string, float64](floats "string, float64"))
}
Salin selepas log masuk

Dalam kod di atas, kami mentakrifkan fungsi Sum(), yang merupakan fungsi generik Anda boleh melihat bahawa perbezaan daripada fungsi biasa ialah terdapat satu set kaedah antara nama fungsi dan senarai parameter fungsi Kurungan [], terdapat dua parameter K dan V dalam kurungan segi empat sama, yang dipanggil

parameter taip

dalam bahasa Go pra-diisytiharkan oleh bahasa Go dan mewakili mana-mana jenis A yang melakukan operasi == dan !=. Sekatan jenis V adalah salah satu daripada int64 dan float64. Parameter fungsi ialah m, jenis ialah peta[K]V, dan jenis pulangan ialah V. Memanggil fungsi juga sedikit berbeza daripada memanggil fungsi biasa Terdapat satu set kurungan segi empat sama [] antara nama fungsi dan parameter sebenar, menunjukkan nama jenis. Sebagai contoh, apabila fungsi Sum() dipanggil buat kali pertama, nama jenis masing-masing adalah rentetan dan int64 Kemudian apabila fungsi itu dilaksanakan, jenis K dan V yang sepadan adalah rentetan dan int64 masing-masing.

第二次调用该 Sum() 函数时,K、V 的类型分别是 string 和 float64。

通过泛型编程,我们就可以实现一个函数处理多种数据类型。

执行上面的代码输出:

3
62.97
Salin selepas log masuk

Atas ialah kandungan terperinci Penerokaan awal generik dalam Go1.18. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
go
sumber:Go语言进阶学习
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