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

Penerokaan awal generik dalam Go1.18

Go语言进阶学习
Go语言进阶学习ke hadapan
2023-07-24 15:00:40864semak imbas

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
}

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"))
}

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

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

Kenyataan:
Artikel ini dikembalikan pada:Go语言进阶学习. Jika ada pelanggaran, sila hubungi admin@php.cn Padam