Editor PHP, Strawberry, akan memperkenalkan kepada anda fungsi umum yang sangat praktikal, yang boleh digunakan untuk menetapkan medan struktur yang berbeza kepada nilai yang dipetakan. Fungsi ini boleh membantu kami menjadi lebih fleksibel dan mudah semasa memproses data, dan tidak lagi dihadkan oleh struktur medan. Sama ada tatasusunan, objek atau jenis data lain, fungsi ini boleh digunakan untuk melaksanakan operasi pemetaan medan, meningkatkan kecekapan pembangunan dan kebolehselenggaraan kod kami. Jika anda sering perlu memproses bidang struktur yang berbeza, anda juga boleh mencuba fungsi umum ini, saya percaya ia akan membawa anda banyak bantuan!
Mempunyai struktur dengan medan yang sama...
type definition struct { id string ... } type requirement struct { id string ... } type campaign struct { id string ... }
...Saya mempunyai pelbagai fungsi seperti ini:
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 }
Saya mahukan satu fungsi yang menyamaratakan akses dengan generik (atau antara muka, dll.), jenis...
func fillIds[T Definition|Requirement|Campaign](values *map[string]T) { for key, value:=range *values { value.Id=key (*values)[key]=value } }
Sudah tentu, ini membawa kepada value.id 未定义(类型 t 没有字段或方法 id)
. Saya telah dapat mengatasi masalah yang sama banyak kali, tetapi kali ini saya tidak dapat mencari penyelesaian.
Bagaimana untuk mengabstrak set fungsi ini kepada satu fungsi?
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
Alternatif kepada jawapan @blackgreen jika anda perlu menggunakan nilaipemetaan.
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
Atas ialah kandungan terperinci Fungsi generik untuk menetapkan medan struktur berbeza yang digunakan sebagai nilai yang dipetakan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!