Golang返回map [string] interface {}返回变量struct

时间:2016-11-07 16:02:41

标签: go

我需要一个大的结构表,我需要处理返回的结构。

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(类型接口{}是没有方法的接口)有没有办法做到这一点?

1 个答案:

答案 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)

}