将结构传递给跨包的函数

时间:2017-01-16 22:01:07

标签: pointers go struct

为了更加熟悉go,我试图重构一些已经正常工作的代码。

原始代码有三个结构:

type ConfigGroup struct {
        Interval int
        Tprefix string
        Target []string
}

type ConfigDefaults struct {
        Interval int
        Sprefix string
}

type Config struct {
    Group map[string]*ConfigGroup
    Defaults ConfigDefaults
}

这些结构传递给类似的函数:

func runpinger(clientStatsd statsd.Statter, defaults *ConfigDefaults, group *ConfigGroup) {
// some stuff here
}

现在,我已经重新设计了配置(使用gocfg)而不是使用hcl,这似乎提供了更清晰的配置语法。

我已将配置解析器移动到一个包config中,其结构如下所示:

type Config struct {
  Interval int            `hcl:"interval"`
  Prefix   string         `hcl:"prefix"`
  Groups   []TargetGroups `hcl:"target_group"`
}

type TargetGroups struct {
  Name     string    `hcl:",key"`
  Prefix   string    `hcl:"prefix"`
  Interval int       `hcl:"interval"`
  Targets  []Targets `hcl:"target"`
}

type Targets struct {
  Address string `hcl:"address"`
  Label   string `hcl:"label"`
}

然后config包中的函数如下所示:

func Parse(ConfigFile string) (*Config, error) {

  result := &Config{}
  var errors *multierror.Error

  config, err := ioutil.ReadFile(ConfigFile)

  if err != nil {
    return nil, err
  }

  hclParseTree, err := hcl.Parse(string(config))
  if err != nil {
    return nil, err
  }

  if err := hcl.DecodeObject(&result, hclParseTree); err != nil {
    return nil, err
  }

  return result, errors.ErrorOrNil()

}

现在,在我的主程序包中,我想再次将这些结构传递给函数。我怎么能跨包?

我试过了:

func(runpinger config *config.Config) {
 // here
}

但这似乎不起作用。理想情况下,我只想将指针传递给"子结构" (即TargetGroups结构),虽然我不确定是否可能。

1 个答案:

答案 0 :(得分:1)

您应该能够将结构传递给主包,只需检查是否将import "path/to/config"放在文件的顶部。

路径必须是$GOPATH/src/目录

中包的完整路径
相关问题