Maison  >  Article  >  développement back-end  >  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
PHPzavant
2024-02-10 14:10:08424parcourir

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
        ...
}

...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
}

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
        }                                
}

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 }
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)
    }
}
func main() {
    m1 := map[string]definition{"foo": {}, "bar": {}}
    fillids(m1)
    fmt.println(m1)

    m2 := map[string]campaign{"abc": {}, "def": {}}
    fillids(m2)
    fmt.println(m2)
}

https://www.php.cn/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
}

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
    }
}
func main() {
    m1 := map[string]definition{"foo": {}, "bar": {}}
    fillids(m1)
    fmt.println(m1)

    m2 := map[string]campaign{"abc": {}, "def": {}}
    fillids(m2)
    fmt.println(m2)
}

https://www.php.cn/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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer