Rumah >pembangunan bahagian belakang >Golang >Generik: Kekangan dan struktur yang dibenamkan dalam antara muka

Generik: Kekangan dan struktur yang dibenamkan dalam antara muka

王林
王林ke hadapan
2024-02-08 23:21:19595semak imbas

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.

Kandungan masalah

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.

Penyelesaian

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 teststructwithname ialah dua jenis yang berbeza. Satu-satunya persamaan ialah jenis asas mereka.

antara muka kekangan jenis { structwithname } Antara muka ialah set jenis yang mengandungi hanya satu jenis, iaitu 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 }

is

~t,表示任何类型,其底层类型t.

Tide di hadapan jenis dalam kekangan, iaitu, ~t, mewakili

sebarang

jenis yang

jenis asasnya

adalah sama dengan t. Atau, lebih tepat lagi, struct { name string } Set jenis item dalam bentuk

~t ialah set semua jenis dengan jenis asas t. 🎜 🎜Jadi apabila anda melakukannya 🎜
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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam