为了账号安全,请及时绑定邮箱和手机立即绑定

Go 接口/容器使用

Go 接口/容器使用

Go
慕森卡 2021-07-08 14:13:52
新手 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 切片。
查看完整描述

1 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

只需为它创建一个接口


type Configurable interface {

    Configuration() []string

}

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


不过,只传入切片而不是结构会容易得多。


查看完整回答
反对 回复 2021-07-19
  • 1 回答
  • 0 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信