Maison > développement back-end > Golang > le corps du texte

Comment obtenir les noms et valeurs des colonnes de l'objet Gorm ?

WBOY
Libérer: 2024-02-09 15:30:09
avant
1234 Les gens l'ont consulté

如何从 Gorm 对象获取列名称和值?

php Editor Strawberry Dans le développement de la programmation, nous utilisons souvent des objets Gorm pour les opérations de base de données. Parfois, nous devons obtenir le nom de la colonne et la valeur correspondante à partir de l'objet Gorm. Alors, comment répondre à cette exigence ? Dans Gorm, nous pouvons obtenir les propriétés et les valeurs de l'objet par réflexion, et les combiner avec les étiquettes de Gorm pour obtenir les noms de colonnes. Ensuite, je présenterai en détail comment obtenir les noms et les valeurs des colonnes à partir des objets Gorm. Nous allons jeter un coup d'oeil!

Contenu de la question

Je souhaite écrire une fonction qui peut prendre n'importe quel objet chargé depuis la base de données (via gorm) et imprimer tous les noms et valeurs de colonnes. Évidemment, l'élément clé est la possibilité de transmettre n'importe lequel de mes modèles Gorm dans cette fonction. Je ne les montre pas ci-dessous car ils sont tous simples.

Ce que j'ai jusqu'à présent, c'est une fonction avec une interface et un code de test qui l'appelle :

func testfunc(s interface{}) {

    // type
    v := reflect.TypeOf(s)

    fmt.Println(v)

    // fields?
    for i := 0; i < v.NumField(); i++ {
        fmt.Println(i)
    }
}
Copier après la connexion
trans := make([]orm.Trans, 0)

    db.Where("state = ?", state.FINISHED).Limit(1).Find(&trans)

    testfunc(trans)
Copier après la connexion

Lors de l'exécution, le type s'imprime puis panique :

[]orm.Trans
panic: reflect: call of reflect.Value.NumField on slice Value
Copier après la connexion

Je suis un débutant, donc vos idées sont les bienvenues. Il semble que mes choix possibles soient :

  • Utilisez la réflexion (le cas échéant pour le découpage)
  • Trouver un champ dans un modèle d'une manière ou d'une autre ?
  • D'autres idées ?

Merci.

Solution

Essayez cette méthode :

func testfunc(x interface{}){
        v := reflect.ValueOf(x)
        s := reflect.TypeOf(x)
        names:=make([]interface{},v.NumField())
        values := make([]interface{}, v.NumField())

        for i := 0; i < v.NumField(); i++ {
                values[i] = v.Field(i).Interface()
                names[i] = s.Field(i).Name
        }
        fmt.Println("Names",names)
        fmt.Println("values",values)

}
Copier après la connexion

1- Vous passez une tranche de structure. (Si vous utilisez le découpage, évitez d'appeler la fonction ci-dessus en boucle.)

2- Je passe cette structure à la fonction ci-dessus

x := struct {
                Name string
                Id int
        }{"Zargham", 2}
Copier après la connexion

3-Obtenir le résultat :-

Names [Name Id]
values [Zargham 2]
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