2017-12-31 76 views
0

私は現在golang(主にJava/C#開発者)を勉強しています。Golangポインタが構造体内でどのように保持されるかについての混乱

私はOOのようなスタイルの構造体の下にCSVファイルへの書き込みをラップしようとしています。

type MyObject struct { 
    fp *os.File 
    csv *csv.Writer 
} 

func (mo MyObject) Open(filepath string) { 

    println(&mo) 
    var err error 
    mo.fp, err = os.Create(filepath) 
    if err != nil { 
     panic(err) 
    } 

    mo.csv = csv.NewWriter(mo.fp) 
} 

私はかつて私は、Openメソッドを残したヒット問題は、FPおよびCSVのためのポインタが戻った:私はオンラインで見つけるの例から、構造体の「メソッド」を作成そうのように行うことができるようですnullにするこのクラスへの後続の呼び出しは、nilエラーをスローします。完全な例はhereです。

多くのグーグルの後、私はゴランがどのようにloggerを実装したかを調べました。彼らはとても似オブジェクトへのポインタを使用:

type MyObject struct { 
    fp *os.File 
    csv *csv.Writer 
} 

func New() *MyObject { 
    return &MyObject{} 
} 

func (mo *MyObject) Open(filepath string) { 

    println(&mo) 
    var err error 
    mo.fp, err = os.Create(filepath) 
    if err != nil { 
     panic(err) 
    } 

    mo.csv = csv.NewWriter(mo.fp) 
} 

私のコードのリファクタリング期待どおりに動作を示す(hereを参照してください)。私はまだ最初の方法がうまくいかなかったのに、まだ混乱しています。私は、構造体、ポインタ、および/または作業を延期する方法について何かを誤解していると思います。私は何が欠けていますか?

+2

https://golang.org/doc/faq#methods_on_values_or_pointersに –

答えて

3

func (mo MyObject) Open(filepath string)はローカルコピーMyObjectしか取得していないため、最初のケースでは機能しませんでした。その変更はすべてそのコンテキスト内にとどまりました。

*を受信者に追加した後は、(mo *MyObject)という機能内の変更が元のMyObjectに影響を与えました。

you can check here for more info

希望は、これは多くの理にかなってその質問に私を指しているため

+1

感謝を助けます! – Bryan

+0

willkommen..gladが手伝ってくれます! –

関連する問題