2017-12-31 61 views
0

Ich lerne gerade Golang (meist ein Java/C# -Entwickler) und ich ein Problem mit Zeigern und Defer stoßen.Verwirrung darüber, wie Golang-Zeiger in Strukturen erhalten bleiben

Ich versuche, die Schreibvorgänge in einer CSV-Datei unter einer Struktur in einem OO-ähnlichen Stil zu wickeln. Aus den Beispielen fand ich online, so scheint es, dass „Methoden“ auf eine Struktur zu schaffen, wie dies getan werden könnte:

I
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) 
} 

Das Problem getroffen wurde, sobald ich die Open-Methode verlassen, die Zeiger für fp und csv ging zurück zu null. Nachfolgende Aufrufe an diese Klasse würden einen Null-Fehler auslösen. Ein vollständiges Beispiel kann here gefunden werden.

Nach einer Menge googeln, endete ich damit, wie Golang ihre logger implementiert. Sie benutzten einen Zeiger auf das Objekt wie folgt:

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) 
} 

Ein Refactoring meines Codes (siehe here) zeigt es wie erwartet funktioniert. Ich bin immer noch verwirrt, obwohl die erste Methode nicht funktioniert hat. Ich vermute, dass ich etwas falsch verstehe, wie Strukturen, Zeiger und/oder Arbeit verschoben werden. Was vermisse ich?

+2

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

Antwort

3

Es hat im ersten Fall nicht funktioniert, weil func (mo MyObject) Open(filepath string) nur eine lokale Kopie von MyObject erhalten hat ... und alle Änderungen, die daran vorgenommen wurden, blieben in diesem Kontext.

Aber nachdem Sie dem Empfänger * hinzugefügt haben, d. H. (mo *MyObject) die Änderungen innerhalb der Funktion das ursprüngliche MyObject betroffen.

you can check here for more info

Hoffnung hilft diese

+1

Vielen Dank für mich zu dieser FAQ zeigen, dass viel mehr Sinn macht! – Bryan

+0

willkommen..glad zu helfen! –

Verwandte Themen