2014-01-22 76 views
0

Newbie Go程序員在這裏。我正在編寫一個讀取JSON配置文件的包。當然,它使用內置的JSON解碼。但我希望它能夠包含其他JSON文件,方法是使用'Includes'鍵查找一組文件名。我得到它只是一個函數,並傳入一個JSON數據的結構,其中包含一段標籤爲「包含」的字符串,但我不知道如何將其指定爲包。Go接口/容器使用

這裏的功能:

func ReadConfig(filename string, configuration *Configuration) error { 

    log.Println("reading file", filename) 
    file, err := os.Open(filename) 
    if err != nil { 
    log.Println("Can't read", filename) 
    return err 
    } 
    decoder := json.NewDecoder(file) 
    if err := decoder.Decode(&configuration); err != nil { 
    log.Println(err) 
    return err 
    } 

    includes := make([]string, len(configuration.Includes)) 
    copy(includes, configuration.Includes) 
    config.Includes = configuration.Includes[0:0] 
    for _, inc := range includes { 
    log.Println(inc) 
    if err := ReadConfig(inc, configuration); err != nil { 
     return err 
    } 
    } 

    return nil 
} 

與工程:

type Configuration struct { 
    Includes []string 
    .... other defs 
} 

但是,在一個包,我想ReadConfig採取任何一種配置結構,只要其成員之一是'包含[]字符串'。

我相信我需要改變ReadConfig DEF到:

func ReadConfig(filename string, configuration interface{}) 

但我不知道是如何訪問內的包括片。

回答

3

只需創建一個接口爲它

type Configurable interface { 
    Configuration() []string 
} 

,然後提供Configuration方法,而不是一個領域的結構,和你的函數的簽名更改爲func ReadConfig(filename string, configuration Configurable)

雖然只是傳遞片而不是結構會容易得多。

+0

謝謝,這是有效的。我不明白你的最後一句話。配置數據結構不僅僅是一段字符串。 –

+0

@MarkFletcher阻止你將它作爲'ReadConfig(config.Includes)'而不是'ReadConfig(config)'調用它嗎? – Cubic

+0

ReadConfig將JSON文件讀取到config結構中,該結構由Include以外的其他(可能是非字符串/切片)字段組成。你是否建議在第二個參數中傳入一個指向包含在配置結構中的包含的指針? –