Rumah >pembangunan bahagian belakang >Golang >Generik: Kekangan dan struktur yang dibenamkan dalam antara muka
editor php Xiaoxin membawakan anda pengenalan kepada generik. Generik ialah kekangan dan struktur yang tertanam dalam antara muka yang membolehkan kita menjadi lebih fleksibel dan cekap semasa menulis kod. Dengan menggunakan generik, kami boleh mencari dan menyelesaikan ralat jenis pada masa penyusunan, meningkatkan kebolehbacaan dan kebolehselenggaraan kod. Generik juga boleh membantu kami mereka bentuk struktur data dan algoritma yang lebih umum, meningkatkan kebolehgunaan semula kod. Dalam artikel ini, kami akan menyelidiki konsep, penggunaan dan aplikasi praktikal generik untuk membantu anda memahami dan menggunakan pengaturcaraan generik dengan lebih baik.
Kod berikut tidak boleh disusun dan dilaporkan ./main.go:35:7: test does not meet constraint (test missing in main.structwithname)
package main import "fmt" type Test struct { Name string } func (t Test) String() string { return fmt.Sprintf("Name: %v", t.Name) } type StructWithName struct { Name string } type Constraint interface { StructWithName // ~struct { // Name string // } String() string } func Print[T Constraint](x T) { //s := T{} fmt.Printf("Hello %v", x) } func main() { t := Test{ Name: "Test", } Print(t) }
Walau bagaimanapun, jika saya mengulas structwithname
dan menyahkomen blok ~struct, maka ia disusun dengan baik. Saya tidak dapat memahami perbezaan semantik antara keduanya.
Apa yang saya cuba lakukan ialah mempunyai kaedah generik yang boleh mengendalikan struct dengan cara generik; iaitu x := s{}
dan kemudian menyerahkannya ke perpustakaan luaran. Dalam kes ini ia adalah untuk pembekal terraform, kod dalam sumber adalah sangat serupa, saya agak terganggu dengan jumlah pertindihan yang saya lihat dalam pembekal sedia ada dalam kes saya sumbernya sangat serupa, ada di antaranya struktur lalai Terdapat hanya satu atau dua medan di atasnya). Saya ingin dapat menulis satu set kaedah generik yang melakukan semua perkara yang serupa, dan hanya mempunyai kekhususan di tempat lain (duh!).
Saya masih di peringkat awal perjalanan saya dan saya tidak dapat memahami ralat pengkompil.
Kalau saya faham betul-betul, apa yang awak nak sangat tak mungkin. Go generik tidak menyokong mengakses subset medan struktur.
Setakat pepijat yang terlibat...
Nama jenis menentukan identiti jenis dan dua jenis dengan nama yang berbeza (bukan alias untuk satu sama lain) sentiasa berbeza, jadi test
dan test
和 structwithname
ialah dua jenis yang berbeza. Satu-satunya persamaan ialah jenis asas mereka.
type constraint 接口 { structwithname }
接口是一个仅包含一种类型的类型集,即 structwithname
,并且由于 test
不是该类型集的成员,这意味着不可能使用 test
, dan oleh kerana test
bukan ahli set jenis ini, ini bermakna tiada Jenis test
boleh digunakan untuk memenuhi kekangan ini.
type struct { name string }
是一个无名类型,任何无名类型的底层类型都是该类型本身,即 struct 的底层类型 { name string }
is struct { name string }
ialah jenis yang tidak dinamakan dan jenis asas bagi mana-mana jenis yang tidak dinamakan ialah jenis itu sendiri, iaitu, jenis asas struct { name string }
~t
,表示任何类型,其底层类型与 t
.
Tide di hadapan jenis dalam kekangan, iaitu, ~t
, mewakili
jenis yang
jenis asasnya adalah sama dengan t
. Atau, lebih tepat lagi, struct { name string }
Set jenis item dalam bentuk
type Constraint interface { ~struct { Name string } }🎜Kemudian set jenis kekangan akan mengandungi sebarang jenis yang mempunyai 🎜 sebagai jenis asasnya. 🎜
Atas ialah kandungan terperinci Generik: Kekangan dan struktur yang dibenamkan dalam antara muka. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!