Rumah > masalah biasa > Apakah maksud generik dalam golang?

Apakah maksud generik dalam golang?

小老鼠
Lepaskan: 2023-06-20 15:25:49
asal
1079 orang telah melayarinya

Generik dalam golang bermaksud menulis templat untuk menyesuaikan dengan semua jenis jenis pembolehubah khusus hanya ditakrifkan apabila digunakan secara khusus ialah gaya atau paradigma bahasa pengaturcaraan yang membolehkan pengaturcara menggunakan program yang ditaip dengan kuat dalam bahasa reka bentuk menggunakan jenis yang ditentukan kemudian dan dinyatakan sebagai parameter semasa instantiasi. Apabila menulis kod dengan logik yang sama untuk jenis yang berbeza, menggunakan generik adalah pilihan yang paling sesuai.

Apakah maksud generik dalam golang?

Persekitaran pengendalian tutorial ini: sistem Windows 10, versi go1.20.1, komputer Dell G3.

Apakah itu generik?

Generik bermaksud menulis templat untuk menyesuaikan diri dengan semua jenis, dan mentakrifkan jenis pembolehubah tertentu hanya apabila digunakan secara khusus

Generik ialah gaya atau paradigma bahasa pengaturcaraan. Generik membenarkan pengaturcara menulis kod dalam bahasa pengaturcaraan yang ditaip kuat menggunakan jenis yang ditentukan kemudian dan ditentukan sebagai parameter pada masa instantiasi.

Parameter formal dan parameter sebenar fungsi

Parameter apabila fungsi ditakrifkan ialah parameter formal (parameter) dan parameter yang diluluskan apabila fungsi itu sebenarnya yang digunakan ialah parameter sebenar (argumen) )

Andaikan terdapat fungsi tambahan Kedua-dua parameter fungsi ini adalah kedua-dua jenis int, dan nilai pulangan juga adalah seperti berikut:

func Test(a,b int) int {
    return a + b
}
Salin selepas log masuk

Jika kedua-dua parameter sebenar yang diluluskan adalah kedua-dua jenis int, maka fungsi itu secara semula jadi boleh dilaksanakan secara normal. Walau bagaimanapun, fungsi ini hanya boleh digunakan untuk melaksanakan operasi penambahan jenis int Dengan mengandaikan bahawa operasi penambahan jenis float64 juga diperlukan, kita perlu menulis fungsi lain.

Tidak menyusahkan untuk menulis dua atau tiga jenis pengiraan tambahan, hanya salin dan tampal. Tetapi jika semua jenis pengiraan perlu ditambah, kod tidak akan cukup diperkemas dan tidak mesra untuk dibaca

Pada masa ini, kita akan memikirkan jika sesuatu fungsi boleh menerima semua jenis pengiraan, jadi A fungsi pengiraan telah ditulis dalam dua atau tiga baris kod. Fungsi ini boleh dicapai dengan hanya mentakrifkan gabungan jenis atau ruang letak tanpa menyatakan jenis tertentu semasa mentakrifkan parameter fungsi

Gabungan jenis atau pemegang tempat ini ialah parameter jenis Apabila menentukan Gunakan parameter jenis (parameter jenis), dan gunakan argumen jenis (argumen jenis) apabila sebenarnya memanggil

Fungsi pengiraan pada permulaan ditukar kepada fungsi parameter jenis seperti berikut:

// T 是一个类型形参,在定义函数时类型是不确定的,这里的 any 是 go 泛型定义好的一组类型组合
func Test[T any](a,b T) T {
    return a + b
}
// 调用时传入类型实参,伪代码Test[int](1,2)
Test(1,2)
Salin selepas log masuk

Dengan memperkenalkan parameter jenis Konsep parameter dan jenis argumen membenarkan fungsi mengendalikan berbilang jenis data yang berbeza Kaedah pengaturcaraan ini dipanggil pengaturcaraan generik

Mengapa ia generik?

Dalam contoh tambahan sebelumnya, sebagai tambahan. untuk menggunakan generik, pemprosesan jenis data dinamik juga boleh dilaksanakan melalui antara muka + refleksi Go. Fungsi yang boleh dicapai oleh generik pada asasnya boleh dicapai melalui antara muka + refleksi Walau bagaimanapun, jika anda telah menggunakan refleksi, anda akan memahami bahawa mekanisme pantulan mempunyai banyak masalah:

Ia menyusahkan untuk digunakan dan memerlukan pemikiran logik yang kuat. untuk kehilangan kompilasi. Pemeriksaan jenis terdedah kepada pepijat dan prestasi buruk

Tetapi tidak boleh dikatakan bahawa Generik digunakan dalam semua senario Generik mempunyai senario yang sesuai Ian Lance Taylor menerbitkan artikel di laman web blog rasmi bila menggunakan generik

Untuk meringkaskan senario penggunaan generik dalam satu ayat: Apabila anda menulis kod dengan logik yang sama untuk jenis yang berbeza, maka menggunakan generik ialah The pilihan yang paling sesuai.

Contoh generik Go

Fungsi generik

// Add sums the values of T. It supports string, int, int64 and float64
//
// @Description A simple additive generic function
// @Description 一个简单的加法泛型函数
// @parameter   a, b    T string | int | int64 | float64    "generics parameter"
// @return      c       T string | int | int64 | float64    "generics return"
func Add[T string | int | int64 | float64](a, b T) T {
    return a + b
}
 
// 使用
Add(1, 2)
Add(1.0,2.0)
Salin selepas log masuk

Jenis generik

// MyChan Custom generics chan type
// 一个泛型通道,可用类型实参 int 或 string 实例化
type MyChan[T int | string] chan T
Salin selepas log masuk

Isytiharkan sekatan jenis ( kekangan jenis)

Kekangan jenis dalam Go dilaksanakan melalui antara muka

// CustomizationGenerics custom generics
//
// @Description custom generics, which are type restrictions
// @Description ~is a new symbol added to Go 1.18, and the ~ indicates that the underlying type is all types of T. ~ is pronounced astilde in English
// @Description 自定义泛型,即类型限制
// @Desciption ~ 是 Go 1.18 新增的符号,~ 表示底层类型是T的所有类型。~ 的英文读作 tilde
//
// @Example With the addition of ~, MyInt can be used, otherwise there will be type mismatch
// @Example 加上 ~,那么 MyInt 自定义的类型能够被使用,否则会类型不匹配
type CustomizationGenerics interface {
    ~int | ~int64
}
Salin selepas log masuk

Atas ialah kandungan terperinci Apakah maksud generik dalam 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