关于如何在结构中保留Golang指针的困惑

问题描述 投票:1回答:1

我目前正在学习golang(主要是Java / C#开发人员),我用指针和延迟来解决问题。

我正在尝试将写入包装在类似于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。对此类的后续调用将抛出零错误。一个完整的例子可以找到here

经过大量的谷歌搜索后,我最终看到了golang如何实现他们的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)显示它按预期工作。我仍然感到困惑,为什么第一种方法不起作用。我猜我错误地理解了结构,指针和/或延迟工作的内容。我错过了什么?

oop pointers go
1个回答
4
投票

它在第一种情况下不起作用,因为func (mo MyObject) Open(filepath string)只获得了MyObject的本地副本......并且对它做出的所有更改都保留在该上下文中。

但是在将*添加到接收器之后,即(mo *MyObject),函数内的更改会影响原始的MyObject。

you can check here for more info

希望这可以帮助

© www.soinside.com 2019 - 2024. All rights reserved.