Fungsi generik untuk menetapkan medan struktur berbeza yang digunakan sebagai nilai yang dipetakan

PHPz
Lepaskan: 2024-02-10 14:10:08
ke hadapan
424 orang telah melayarinya

Fungsi generik untuk menetapkan medan struktur berbeza yang digunakan sebagai nilai yang dipetakan

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!

Kandungan soalan

Mempunyai struktur dengan medan yang sama...

type definition struct {
        id string
        ...
}
type requirement struct {
        id string
        ...
}
type campaign struct {
        id string
        ...
}
Salin selepas log masuk

...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
}
Salin selepas log masuk

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
        }                                
}
Salin selepas log masuk

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?

Penyelesaian

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

    m2 := map[string]campaign{"abc": {}, "def": {}}
    fillids(m2)
    fmt.println(m2)
}
Salin selepas log masuk
Salin selepas log masuk

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
}

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

    m2 := map[string]campaign{"abc": {}, "def": {}}
    fillids(m2)
    fmt.println(m2)
}
Salin selepas log masuk
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!