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中文網其他相關文章!