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

Struktur generik yang menerima sebarang struktur

王林
Lepaskan: 2024-02-06 08:21:04
ke hadapan
886 orang telah melayarinya

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)
}
Salin selepas log masuk

Kandungan utama

NewUser()
Salin selepas log masuk

Ralat

cannot convert model_user (variable of type *User) to type model
Salin selepas log masuk


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)
}
Salin selepas log masuk

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>
Salin selepas log masuk

Atas ialah kandungan terperinci Struktur generik yang menerima sebarang struktur. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan