【问题标题】:Go Interface/Container usageGo 接口/容器使用
【发布时间】: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 go package


【解决方案1】:

只需为它创建一个接口

type Configurable interface {
    Configuration() []string
}

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

虽然传入切片而不是结构会容易得多。

【讨论】:

  • 谢谢,这行得通。我不明白你的最后一句话。配置数据结构不仅仅是一片字符串。
  • @MarkFletcher 是什么阻止您将其称为ReadConfig(config.Includes) 而不是ReadConfig(config)
  • ReadConfig 将 JSON 文件读入配置结构,该结构由除 Includes 之外的其他(可能是非字符串/切片)字段组成。您是否建议在配置结构中传递第二个参数,该参数是指向 Includes 的指针?
猜你喜欢
  • 2011-10-25
  • 2012-10-28
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多