-1
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
}
これらの構造体がそうのような関数に渡されます:
元のコードでは、3つの構造体がある今
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
}
をしかし、それは動作していないようでした。理想的には、 "sub-struct"(つまりTargetGroups構造体)へのポインタも渡すだけですが、可能かどうかはわかりません。
感謝からあなたのパッケージへの完全なパスである必要があり、それは私がまったく同じものです。なぜ私はこれを見つけるのが難しいのか分かりませんが、今はうまくいきます – jaxxstorm