Generische Struktur, die jede Struktur akzeptiert

王林
Freigeben: 2024-02-06 08:21:04
nach vorne
836 Leute haben es durchsucht

Generische Struktur, die jede Struktur akzeptiert

Frageninhalt

Wie erstellt man eine universelle Struktur, die jede Struktur akzeptiert?

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)
}
Nach dem Login kopieren

Hauptinhalt

NewUser()
Nach dem Login kopieren

Fehler

cannot convert model_user (variable of type *User) to type model
Nach dem Login kopieren


Richtige Antwort


Per Definition addiert die model 结构似乎存在,用于将 Select()-Funktion die im Modell enthaltenen Werte (oder versucht sie hinzuzufügen).

d.h. Sie möchten anscheinend eine Art Typanbieteraufruf Select() 的能力,并对任何任意类型的值执行某些操作(大概在 Select() unter Verwendung einer Art Typschalter in der Implementierung).

Wenn das der Fall ist, dann nutzen Sie besser den interface 并消除 model Mittelsmann:

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)
}
Nach dem Login kopieren

Sie finden die Select(Selectable) 函数是多余的(您可以直接调用 u.Select() ;提供它只是为了说明在需要 Selectable 的情况下可以使用任何类型的值,前提是该类型实现了 Selectable-Schnittstelle.

interfaces in GoLang bietet Duck-Typing – wenn ein Typ den Vertrag einer Schnittstelle implementiert, dann implementiert er diese Schnittstelle, auch wenn der konkrete Typ vorher keine formale Schnittstellendefinition kennt. d.h. „Wenn es wie eine Ente aussieht und wie eine Ente quakt, dann ist es eine Ente.“

Wenn der Zweck darin besteht, von User 类型(或其他类型)中删除 Select()ing 的逻辑,并将其隔离在单独的“选择器”中,那么可以通过删除 model zu vermitteln und einfach eine Funktion zu implementieren, um dies erneut zu tun, führen Sie die Typkonvertierung durch:

<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>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonGenerische Struktur, die jede Struktur akzeptiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage