【发布时间】:2014-01-22 21:54:21
【问题描述】:
新手 Go 程序员在这里。我正在编写一个读取 JSON 配置文件的包。当然,它使用内置的 JSON 解码。但我希望它也能够包含其他 JSON 文件,方法是查找具有“包含”键的文件名数组。我让它作为一个函数工作,并为 JSON 数据传递一个结构,其中包括一段标记为“包含”的字符串,但我不知道如何将其指定为一个包。
函数如下:
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 采用任何类型的配置结构,只要它的成员之一是“包含 []string”。
我认为我需要将 ReadConfig def 更改为:
func ReadConfig(filename string, configuration interface{})
但我不知道如何访问其中的 Includes 切片。
【问题讨论】:
-
可能值得注意的是,采用单一方法
interface的 API 可以重写为采用函数类型。见stackoverflow.com/a/63557675/12817546。