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:
Itype 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?
https://golang.org/doc/faq#methods_on_values_or_pointers –