2016-11-07 14 views
-1

構造体の大きなテーブルが必要です。返される構造体を処理する必要があります。Golang return map [string] interface {}可変構造体を返す

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) 

} 
関連する問題