Rumah > Artikel > pembangunan bahagian belakang > Gunakan mana-mana untuk membuat contoh antara muka biasa, struct tidak melaksanakannya
Dalam artikel ini, editor PHP Youzi akan memperkenalkan anda kepada kaedah menggunakan mana-mana untuk membuat instantiate antara muka universal, dan menerangkan sebab struct tidak melaksanakannya. Antara muka generik ialah corak reka bentuk yang sangat berguna yang membolehkan kami menggunakan cara yang lebih fleksibel semasa menulis kod. Walau bagaimanapun, apabila menggunakan antara muka biasa, kita perlu memberi perhatian kepada beberapa butiran untuk mengelakkan masalah yang tidak perlu. Mari kita lihat cara membuat instantiate antara muka generik dengan betul menggunakan mana-mana dan fahami sebab struct tidak melaksanakannya.
Bolehkah seseorang menerangkan mengapa *DataTo
不满足 ToType[any]
?
Cuba bina satu DTOer
,将一个结构的所有值复制到另一个结构,并设置一些显式值(在本例中为 V
)
https://go.dev/play/p/-oobZrw5Ewe
// You can edit this code! // Click here and start typing. package main import "fmt" type DataFrom struct { V1 int } type DataTo struct { V int } func (m *DataTo) SetVal() { m.V = 1 return } type ToType[T any] interface { SetVal() *T } type DTO[TFrom any, TTo ToType[any]] struct { Get func(from TFrom) TTo } func main() { dto := &DTO[DataFrom, *DataTo]{ Get: func(from DataFrom) *DataTo { return &DataTo{V: from.V1 + 666} }, } vFrom := DataFrom{V1: 1} vTo := dto.Get(vFrom) fmt.Println(vTo.V) }
keranaany
adalah jenis statik.
Jika anda menggunakan ini untuk membuat contoh jenis generik seperti ToType
, jenis generik akan menjangkakan dengan tepat ToType
这样的泛型类型,则该泛型类型将准确地期望 any
.
Kini, penggunaan parameter jenis tertentu mungkin menyembunyikan isu ini, contohnya:
type Foo[T any] struct { Value T } Foo[any]{Value: 12} // ok
Biasanya, anda boleh menentukan apa-apa jenis untuk any
指定任何类型,因为 any
只是空接口 interface{}
seperti di atas, kerana
*T
)时,使用 any
实例化意味着完全是 *any
。因此,您可以将 ToType[any]
Apabila parameter jenis digunakan untuk jenis komposit (cth. *T
), instantiasi menggunakan
tepat *mana-mana
*DataTo
显然不是 *any
. Jadi anda boleh menganggap ToType[any]
sebagai perkara yang sama:
type ToTypeAny interface {
SetVal()
*any
}
Kemudian
Menetapkan penunjuk struktur kepada penunjuk antara muka
Jika anda mengisytiharkan struct seperti berikut, ia akan menyusun: 🎜
type DTO[TFrom any, TTo ToType[DataTo]] struct { Get func(from TFrom) TTo }🎜Atau dengan cara yang lebih "generik" tetapi juga lebih terperinci: 🎜
type DTO[TFrom any, T any, TTo ToType[T]] struct { Get func(from TFrom) TTo } &DTO[DataFrom, DataTo, *DataTo]{ ... }
Atas ialah kandungan terperinci Gunakan mana-mana untuk membuat contoh antara muka biasa, struct tidak melaksanakannya. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!