Go 接口/容器使用

新手 Go 程序员在这里。我正在编写一个读取 JSON 配置文件的包。当然,它使用内置的 JSON 解码。但我希望它也能够包含其他 JSON 文件,方法是查找带有“Includes”键的文件名数组。我把它当作一个函数来工作,并为 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 切片。


慕森卡
浏览 187回答 1
1回答

饮歌长啸

只需为它创建一个接口type Configurable interface {    Configuration() []string}然后为您的结构提供一个Configuration 方法而不是一个字段,并将您的函数的签名更改为func ReadConfig(filename string, configuration Configurable).不过,只传入切片而不是结构会容易得多。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go