Ulangi peta 'antara muka{}' dan panggil kaedah yang sama pada setiap item dalam Golang

王林
Lepaskan: 2024-02-05 11:57:54
ke hadapan
612 orang telah melayarinya

.

迭代“interface{}”的映射并在 Golang 中的每个项目上调用相同的方法Saya mempunyai antara muka yang dipetakan sebagai medan dalam struct seperti ini:

type room struct {
    // ...
    components map[string]interface{}
    // ...
}
Salin selepas log masuk
Saya perlu mengulangi peta dan memanggil kaedah
untuk setiap item yang disimpan dalam peta. Sebagai contoh dalam js atau php ini tidak akan menjadi masalah, tetapi dalam perjalanan saya menghantukkan kepala saya ke dinding sepanjang hari.

Saya perlukan sesuatu seperti ini:

for _, v := range currentroom.components {
    v.render()
}
Salin selepas log masuk

Ini tidak berjaya, tetapi apabila saya menyatakan jenis dan memanggil setiap item secara manual secara individu, ia berjaya:

currentRoom.Components["menu"].(*List.List).Render()
currentRoom.Components["header"].(*Header.Header).Render()
Salin selepas log masuk

Bagaimana untuk memanggil kaedah render() 方法(假设它们都实现 render() pada setiap item dalam peta? Atau jika ada cara yang lebih baik/berbeza untuk menyelesaikan masalah ini, tolong beri pencerahan kepada saya kerana saya berada di hujung akal saya di sini.

Jawapan betul

Tentukan antara muka:render()

type renderable interface {
   render()
}
Salin selepas log masuk

Anda kemudian boleh menaip menegaskan elemen peta dan membuat panggilan selagi mereka melaksanakan kaedah itu:
currentroot.components["menu"].(renderable).render()
Salin selepas log masuk

Untuk menguji sama ada sesuatu boleh ditukar, gunakan:

renderable, ok:=currentRoot.Components["menu"].(Renderable)
if ok {
   renderable.Render()
}
Salin selepas log masuk

Atas ialah kandungan terperinci Ulangi peta 'antara muka{}' dan panggil kaedah yang sama pada setiap item dalam Golang. 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