Rumah >pembangunan bahagian belakang >Golang >Struktur generik yang menerima sebarang struktur
Bagaimana untuk membuat struktur universal yang menerima sebarang struktur?
package model type model struct { m *interface{} } func (m *model) Select(){ } type ( field struct { table string field string } fields map[string]field ) type User struct { schema string fields fields } func NewUser() *interface{} { model_user := &User{ schema: "main", fields: fields{ "id": field{"user","id"}, "client_id": field{"user","client_id"}, "email": field{"user","email"}, }, } return model(model_user) }
Kandungan utama
NewUser()
Ralat
cannot convert model_user (variable of type *User) to type model
Mengikut takrifan, fungsi model
结构似乎存在,用于将 Select()
menambah (atau cuba menambah) pada nilai yang terkandung dalam model.
iaitu anda nampaknya mahu beberapa jenis panggilan disediakan Select()
的能力,并对任何任意类型的值执行某些操作(大概在 Select()
menggunakan beberapa bentuk suis jenis dalam pelaksanaan).
Jika begitu, lebih baik anda menggunakan interface
并消除 model
orang tengah:
type Selectable interface { Select() } type User struct { //... } func (u *User) Select() { // implement Select as appropriate for the User type } func NewUser() *User { return &User{ // ... } } func Select(s Selectable) { s.Select() } func main() { u := NewUser() Select(u) }
Anda akan menemui Select(Selectable)
函数是多余的(您可以直接调用 u.Select()
;提供它只是为了说明在需要 Selectable
的情况下可以使用任何类型的值,前提是该类型实现了 Selectable
antara muka.
interfaces
dalam GoLang menyediakan penaipan itik - jika sesuatu jenis melaksanakan kontrak antara muka, maka ia melaksanakan antara muka itu, walaupun jenis konkrit tidak mengetahui sebarang definisi antara muka formal terlebih dahulu. iaitu "Jika ia kelihatan seperti itik dan cuak seperti itik, maka ia adalah itik".
Jika tujuannya adalah untuk menjadi pengantara daripada User
类型(或其他类型)中删除 Select()ing
的逻辑,并将其隔离在单独的“选择器”中,那么可以通过删除 model
dan hanya melaksanakan fungsi untuk melakukan ini sekali lagi lakukan penukaran jenis:
<code>func Select(v any) error { switch v := v.(type) { case *User: // ... implement for *User or call some private fn which encapsulates this behaviour default: return errors.New("value cannot be Select()ed") } } </code>
Atas ialah kandungan terperinci Struktur generik yang menerima sebarang struktur. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!