Senario:
Dalam pembangunan Golang Revel, kod berulang timbul disebabkan kepada jenis pulangan data yang serupa yang melibatkan struct jenis. Pertimbangkan fungsi berikut:
func (c Helper) Brands() []*models.Brand { // Query rethinkdb and populate the Brand model var brands []*models.Brand rows.All(&brands) return brands } func (c Helper) BlogPosts() []*models.Post { // Query rethinkdb and populate the Post model var posts []*models.Post rows.All(&posts) return posts }
Dalam kedua-dua kes, jenis pemulangan adalah sama (*[]struct). Untuk mengelakkan pertindihan, pendekatan jenis pulangan dinamik dicadangkan:
func (c Helper) ReturnModels(modelName string) []*interface{} { // Query rethinkdb with modelName and return []*interface{} }
Soalan:
Jawapan:
Ya, pulangan jenis dinamik boleh dicapai. Fungsi harus mengembalikan antara muka{} dan bukannya []*antara muka{}. Begini cara ia boleh dilaksanakan:
func (c Helper) ReturnModels(modelName string) interface{} { // Query rethinkdb with modelName and return interface{} }
Untuk menggunakan nilai yang dikembalikan, suis taip atau penegasan jenis digunakan untuk menghantarnya kembali kepada jenis asalnya:
Contoh:
if brands, ok := ReturnModels("brands").([]Brand); ok { // ... } if posts, ok := ReturnModels("posts").([]Post); ok { // ... }
Dengan melaksanakan pendekatan ini, pertindihan kod boleh dikurangkan dengan ketara dengan menggunakan satu pembantu fungsi untuk mendapatkan data.
Atas ialah kandungan terperinci Bagaimana untuk Mencapai Pulangan Jenis Dinamik dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!