Maison > développement back-end > Golang > Fonction générique pour définir des champs de différentes structures utilisés comme valeurs mappées

Fonction générique pour définir des champs de différentes structures utilisés comme valeurs mappées

PHPz
Libérer: 2024-02-10 14:10:08
avant
457 Les gens l'ont consulté

Fonction générique pour définir des champs de différentes structures utilisés comme valeurs mappées

L'éditeur de PHP, Strawberry, vous présentera une fonction générale très pratique, qui peut être utilisée pour définir des champs de structures différentes sur des valeurs mappées. Cette fonction peut nous aider à être plus flexibles et plus pratiques lors du traitement des données, et n'est plus limitée par la structure du champ. Qu'il s'agisse d'un tableau, d'un objet ou d'un autre type de données, cette fonction peut être utilisée pour implémenter des opérations de mappage de champs, améliorant ainsi notre efficacité de développement et la maintenabilité du code. Si vous avez souvent besoin de traiter des champs de structures différentes, autant essayer cette fonction générale, je pense qu'elle vous apportera beaucoup d'aide !

Contenu des questions

Avoir une structure avec des champs communs...

type definition struct {
        id string
        ...
}
type requirement struct {
        id string
        ...
}
type campaign struct {
        id string
        ...
}
Copier après la connexion

...J'ai plusieurs fonctions comme celle-ci :

func filldefinitionids(values *map[string]definition) {           
        for key, value:=range *values { // repeated code
                value.id=key            // repeated code
                (*values)[key]=value    // repeated code
        }                               // repeated code
}
func fillrequirementids(values *map[string]requirement) {           
        for key, value:=range *values { // repeated code
                value.id=key            // repeated code
                (*values)[key]=value    // repeated code
        }                               // repeated code
}
func fillcampaignids(values *map[string]campaign) {           
        for key, value:=range *values { // repeated code
                value.id=key            // repeated code
                (*values)[key]=value    // repeated code
        }                               // repeated code
}
Copier après la connexion

Je veux une fonction unique qui généralise l'accès avec des génériques (ou interfaces, etc.), en quelque sorte...

func fillIds[T Definition|Requirement|Campaign](values *map[string]T) {           
        for key, value:=range *values {
                value.Id=key
                (*values)[key]=value
        }                                
}
Copier après la connexion

Bien sûr, cela mène à value.id 未定义(类型 t 没有字段或方法 id). J'ai réussi à surmonter des problèmes similaires à plusieurs reprises, mais cette fois, je ne trouve pas de solution.

Comment résumer cet ensemble de fonctions en une seule fonction ?

Solution

type definition struct {
    id string
}
type requirement struct {
    id string
}
type campaign struct {
    id string
}

func (v definition) withid(id string) definition   { v.id = id; return v }
func (v requirement) withid(id string) requirement { v.id = id; return v }
func (v campaign) withid(id string) campaign       { v.id = id; return v }
Copier après la connexion
type withid[t any] interface {
    withid(id string) t
}

func fillids[t withid[t]](values map[string]t) {
    for key, value := range values {
        values[key] = value.withid(key)
    }
}
Copier après la connexion
func main() {
    m1 := map[string]definition{"foo": {}, "bar": {}}
    fillids(m1)
    fmt.println(m1)

    m2 := map[string]campaign{"abc": {}, "def": {}}
    fillids(m2)
    fmt.println(m2)
}
Copier après la connexion
Copier après la connexion

//m.sbmmt.com/link/0db32de7aed05af092becfc3789e7700

Une alternative à la réponse de @blackgreen si vous devez utiliser valuemapping.

type common struct {
    id string
}

func (v *common) setid(id string) { v.id = id }

type definition struct {
    common
}
type requirement struct {
    common
}
type campaign struct {
    common
}

Copier après la connexion
type idsetter[t any] interface {
    *t
    setid(id string)
}

func fillids[t any, u idsetter[t]](values map[string]t) {
    for key, value := range values {
        u(&value).setid(key)
        values[key] = value
    }
}
Copier après la connexion
func main() {
    m1 := map[string]definition{"foo": {}, "bar": {}}
    fillids(m1)
    fmt.println(m1)

    m2 := map[string]campaign{"abc": {}, "def": {}}
    fillids(m2)
    fmt.println(m2)
}
Copier après la connexion
Copier après la connexion

//m.sbmmt.com/link/fec3392b0dc073244d38eba1feb8e6b7

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