2017-01-16 10 views
-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構造体)へのポインタも渡すだけですが、可能かどうかはわかりません。

答えて

1

構造体をメインパッケージに渡すことができます。import "path/to/config"をファイルの先頭に配置することを確認してください。

パスが$GOPATH/src/ディレクトリ

+0

感謝からあなたのパッケージへの完全なパスである必要があり、それは私がまったく同じものです。なぜ私はこれを見つけるのが難しいのか分かりませんが、今はうまくいきます – jaxxstorm

関連する問題