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

PHPz
Freigeben: 2024-02-10 14:10:08
nach vorne
424 Leute haben es durchsucht

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
        ...
}
Nach dem Login kopieren

...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
}
Nach dem Login kopieren

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
        }                                
}
Nach dem Login kopieren

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

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

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
}

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

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

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!