去接口/容器使用

时间:2014-01-22 21:54:22

标签: interface go package

新手Go程序员在这里。我正在编写一个读取JSON配置文件的包。当然,它使用内置的JSON解码。但我希望它能够包含其他JSON文件,方法是查找带有'Includes'键的文件名数组。我把它作为一个函数工作,并传入JSON数据的结构,其中包含一些标记为“Includes”的字符串,但我不知道如何将其指定为包。

这是功能:

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采用任何类型的Configuration结构,只要其中一个成员是'Includes [] string'。

我相信我需要将ReadConfig def更改为:

func ReadConfig(filename string, configuration interface{})

但我不知道如何访问其中的Includes切片。

1 个答案:

答案 0 :(得分:3)

只需为它创建一个界面

type Configurable interface {
    Configuration() []string
}

然后提供Configuration 方法而不是结构的字段,并将函数的签名更改为func ReadConfig(filename string, configuration Configurable)

虽然传递切片而不是结构更容易。