为了更加熟悉 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 结构)的指针,尽管我不确定这是否可能。
最佳答案
您应该能够将结构传递给主包,只需检查您是否将 import "path/to/config"
放在文件的顶部。
路径必须是从 $GOPATH/src/
目录到你的包的完整路径
关于pointers - 跨包将结构传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41685713/