Существует ли простой способ преобразования структуры, в которой некоторые поля являются «общими» (interface{}
), в другой тип, имеющий те же имена полей, но «строго типизированный» (int
, string
и т. Д. )
Позвольте сказать, что, учитывая определения:
package main
import (
"fmt"
)
type GenericData struct {
Hard int
Soft interface{}
}
type Data struct {
Hard int
Soft int
}
type GenericDataGenerator func() GenericData
func generateGenericData() interface{} {
return GenericData{1, 2}
}
func returnsGenericDataGenerator() interface{} {
return generateGenericData
}
Требует ли преобразование из GenericData
в Data
явного приведения всех полей interface{}
? Есть ли более простой способ сделать это?
func main() {
gd := generateGenericData()
fmt.Println(gd)
fmt.Println(gd.(GenericData))
// Doesn't work, but is straightforward
// fmt.Println(gd.(Data))
// Works, but is not straight forward
fmt.Println(Data{gd.(GenericData).Hard, gd.(GenericData).Soft.(int)})
genDataGenerator := returnsGenericDataGenerator()
// Doesn't work, but is straightforward
//genDataGenerator.(GenericDataGenerator)()
// Works, but is not straight forward
resp := genDataGenerator.(func() interface{})()
fmt.Println(resp.(GenericData))
}
Код может быть выполнен в:
https://play.golang.org/p/_UVBi5It1FY