为了更加熟悉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结构),虽然我不确定是否可能。
答案 0 :(得分:1)
您应该能够将结构传递给主包,只需检查是否将import "path/to/config"
放在文件的顶部。
路径必须是$GOPATH/src/
目录