2016-11-07 301 views
-1

我需要一个很大的结构表,我需要去掉返回的结构。Golang return map [string] interface {}返回变量struct

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

回答

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) 

} 
相关问题