Rumah >pembangunan bahagian belakang >Golang >Struktur generik yang menerima sebarang struktur

Struktur generik yang menerima sebarang struktur

王林
王林ke hadapan
2024-02-06 08:21:04860semak imbas

Struktur generik yang menerima sebarang struktur

Kandungan soalan

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

Jawapan betul


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!

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