Maison > développement back-end > Golang > Structure générique qui accepte n'importe quelle structure

Structure générique qui accepte n'importe quelle structure

王林
Libérer: 2024-02-06 08:21:04
avant
858 Les gens l'ont consulté

Structure générique qui accepte nimporte quelle structure

Contenu de la question

Comment réaliser une structure universelle qui accepte n'importe quelle structure ?

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)
}
Copier après la connexion

Contenu principal

NewUser()
Copier après la connexion

Erreur

cannot convert model_user (variable of type *User) to type model
Copier après la connexion


Bonne réponse


Par définition, la fonction model 结构似乎存在,用于将 Select() ajoute (ou tente d'ajouter) aux valeurs contenues dans le modèle.

c'est-à-dire que vous semblez vouloir un certain type d'appel fourni Select() 的能力,并对任何任意类型的值执行某些操作(大概在 Select() en utilisant une forme de commutateur de type dans l'implémentation).

Si tel est le cas, il est préférable d'utiliser l'intermédiaire interface 并消除 model :

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)
}
Copier après la connexion

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

interfaces dans GoLang fournit le typage canard - si un type implémente le contrat d'une interface, alors il implémente cette interface, même si le type concret ne connaît au préalable aucune définition formelle d'interface. c'est-à-dire "S'il ressemble à un canard et cancane comme un canard, alors c'est un canard".

Si le but est d'agir comme médiateur à partir de User 类型(或其他类型)中删除 Select()ing 的逻辑,并将其隔离在单独的“选择器”中,那么可以通过删除 model et simplement d'implémenter une fonction pour recommencer, effectuez la conversion de type :

<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>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal