interface - Go接口(interface)/容器使用

标签 interface go package

这里是新手 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 采用任何类型的 Configuration 结构,只要其成员之一是“Includes []string”即可。

我认为我需要将 ReadConfig def 更改为:

func ReadConfig(filename string, configuration interface{})

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

最佳答案

只为它创建一个接口(interface)

type Configurable interface {
    Configuration() []string
}

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

虽然只传递 slice 而不是结构会容易得多。

关于interface - Go接口(interface)/容器使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21294797/

相关文章:

java - 抽象类和多重继承

dictionary - 接受多种接口(interface)类型的数据类型

mongodb - 更新mongodb并返回已完全更改的内容?

go - 找不到我的应用程序的某些方法

go - 在 Go 中如何使用 heap 包?

delphi - 如何获取另一个包所需的所有包的列表

java - 如何访问私有(private)包类的公共(public)成员?

java - 如何修复 JAVA VS 代码中的实现错误, "must implement the inherited abstract class"

java - 在接口(interface)中使用泛型方法没有意义吗?

go - 如何使用 go-redis/redis 包在 Go 中创建 Redis 事务?