首頁 >後端開發 >Golang >設定用作映射值的不同結構的字段的通用函數

設定用作映射值的不同結構的字段的通用函數

PHPz
PHPz轉載
2024-02-10 14:10:08459瀏覽

設定用作映射值的不同結構的字段的通用函數

php小編草莓介紹一個非常實用的通用函數,它能夠用來將不同結構的欄位設定為映射值。這個函數可以幫助我們在處理資料時更加靈活和方便,不再受限於欄位的結構。無論是陣列、物件或其他資料類型,都可以透過這個函數來實現欄位的映射操作,提高我們的開發效率和程式碼的可維護性。如果你經常需要處理不同結構的字段,不妨嘗試這個通用函數,相信它會為你帶來不少幫助!

問題內容

擁有具有共同欄位的結構...

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

...我有多個這樣的函數:

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
}

我想要一個單一的函數,用泛型(或接口,等等)來概括訪問,有點......

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

當然,這會導致 value.id 未定義(類型 t 沒有欄位或方法 id)。我已經多次能夠克服類似的問題,但這次我找不到解決方案。

如何將這組函數抽象化為一個函數?

解決方法

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

#

如果需要使用映射,則可以替代@blackgreen的答案。

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

#

以上是設定用作映射值的不同結構的字段的通用函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除