Generic function for setting fields of different structures used as mapped values

PHPz
Release: 2024-02-10 14:10:08
forward
424 people have browsed it

Generic function for setting fields of different structures used as mapped values

php editor Strawberry will introduce to you a very practical general function, which can be used to set fields of different structures to mapped values. This function can help us be more flexible and convenient when processing data, and is no longer limited by the structure of the field. Whether it is an array, object or other data type, this function can be used to implement field mapping operations, improving our development efficiency and code maintainability. If you often need to process fields of different structures, you might as well try this general function, I believe it will bring you a lot of help!

Question content

Having a structure with common fields...

type definition struct {
        id string
        ...
}
type requirement struct {
        id string
        ...
}
type campaign struct {
        id string
        ...
}
Copy after login

...I have multiple functions like this:

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
}
Copy after login

I want a single function that generalizes access with generics (or interfaces, etc.), kind of...

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

Of course, this results in value.id being undefined (type t has no field or method id) . I've been able to overcome similar problems many times, but this time I can't find a solution.

How to abstract this set of functions into one function?

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

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

https://www.php.cn/link/0db32de7aed05af092becfc3789e7700

An alternative to @blackgreen's answer if you need to use value mapping.

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
}

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

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

https://www.php.cn/link/fec3392b0dc073244d38eba1feb8e6b7

The above is the detailed content of Generic function for setting fields of different structures used as mapped values. For more information, please follow other related articles on the PHP Chinese website!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!