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

Oop 关于Golang指针如何保存在结构中的困惑,oop,pointers,go,Oop,Pointers,Go,我目前正在学习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

我目前正在学习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。随后对此类的调用将抛出nil错误。可以找到完整的示例

在谷歌搜索了很多次之后,我终于看到了golang是如何实现他们的目标的。他们使用指向对象的指针,如下所示:

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

对我的代码进行重构(请参阅)表明它可以按预期工作。我仍然不明白为什么第一种方法不起作用。我猜我误解了结构、指针和/或延迟的工作方式。我缺少什么?

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

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


希望这有帮助,因为
func(mo MyObject)Open(filepath string)
只获取了
MyObject
的本地副本,对它所做的所有更改都保留在该上下文中,所以在第一种情况下它不起作用

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


希望这能有所帮助

谢谢你给我指出那个常见问题,这更有意义!威尔科曼……很乐意帮忙!谢谢你给我指点那个常见问题,那就更有意义了!威尔科曼……很乐意帮忙!