Heim  >  Artikel  >  Backend-Entwicklung  >  Generische Funktion zum Festlegen von Feldern unterschiedlicher Struktur, die als zugeordnete Werte verwendet werden

Generische Funktion zum Festlegen von Feldern unterschiedlicher Struktur, die als zugeordnete Werte verwendet werden

PHPz
PHPznach vorne
2024-02-10 14:10:08425Durchsuche

Generische Funktion zum Festlegen von Feldern unterschiedlicher Struktur, die als zugeordnete Werte verwendet werden

Der Herausgeber von PHP, Strawberry, stellt Ihnen eine sehr praktische allgemeine Funktion vor, mit der sich Felder unterschiedlicher Struktur auf zugeordnete Werte setzen lassen. Diese Funktion kann uns dabei helfen, die Datenverarbeitung flexibler und komfortabler zu gestalten, und ist nicht mehr durch die Struktur des Feldes eingeschränkt. Unabhängig davon, ob es sich um ein Array, ein Objekt oder einen anderen Datentyp handelt, kann diese Funktion zur Implementierung von Feldzuordnungsvorgängen verwendet werden, wodurch unsere Entwicklungseffizienz und die Wartbarkeit des Codes verbessert werden. Wenn Sie häufig Felder unterschiedlicher Struktur verarbeiten müssen, können Sie diese allgemeine Funktion auch ausprobieren. Ich glaube, sie wird Ihnen viel helfen!

Frageninhalt

Eine Struktur mit gemeinsamen Feldern haben...

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

...Ich habe mehrere Funktionen wie diese:

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
}

Ich möchte eine einzelne Funktion, die den Zugriff mit Generika (oder Schnittstellen usw.) verallgemeinert, irgendwie...

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

Das führt natürlich zu value.id 未定义(类型 t 没有字段或方法 id). Ähnliche Probleme konnte ich schon oft lösen, aber dieses Mal finde ich keine Lösung.

Wie kann man diesen Funktionssatz in eine Funktion abstrahieren?

Lösung

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

Eine Alternative zur Antwort von @blackgreen, wenn Sie valuemapping verwenden müssen.

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

Das obige ist der detaillierte Inhalt vonGenerische Funktion zum Festlegen von Feldern unterschiedlicher Struktur, die als zugeordnete Werte verwendet werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen