我需要一个大的结构表,我需要处理返回的结构。
package main
import (
"fmt"
)
var factory map[string]interface{} = map[string]interface{}{
"Date": Date{},
"DateTime": DateTime{},
}
type Date struct {
year int //xsd:int Year (e.g., 2009)
month int //xsd:int Month (1..12)
day int //xsd:int Day number
}
func( d *Date ) Init(){
d.year = 2009
d.month = 1
d.day = 1
}
type DateTime struct {
date Date //Date
hour int //xsd:int
minute int //xsd:int
second int //xsd:int
timeZoneID string //xsd:string
}
func( d *DateTime ) Init(){
d.hour = 0
d.minute = 0
d.second = 0
}
func main() {
obj := factory["Date"]
obj.Init()
fmt.Println( obj )
}
Go Playground 但我得到错误obj.Init undefined(类型接口{}是没有方法的接口)有没有办法做到这一点?
答案 0 :(得分:2)
基本上,您需要告诉编译器您的所有类型(地图中的实例)将始终具有Init方法。为此,您使用Init方法声明一个接口并构建该接口的映射。 由于你的接收器使用指针* xxx,你需要通过添加&来将对象的指针添加到地图(而不是对象本身)。在他们面前。
package main
import (
"fmt"
)
type initializer interface {
Init()
}
var factory map[string]initializer = map[string]initializer{
"Date": &Date{},
"DateTime": &DateTime{},
}
type Date struct {
year int //xsd:int Year (e.g., 2009)
month int //xsd:int Month (1..12)
day int //xsd:int Day number
}
func (d *Date) Init() {
d.year = 2009
d.month = 1
d.day = 1
}
type DateTime struct {
date Date //Date
hour int //xsd:int
minute int //xsd:int
second int //xsd:int
timeZoneID string //xsd:string
}
func (d *DateTime) Init() {
d.hour = 0
d.minute = 0
d.second = 0
}
func main() {
obj := factory["Date"]
obj.Init()
fmt.Println(obj)
}