oop - 对如何在结构中保留 Golang 指针的困惑

标签 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
    mo.fp, err = os.Create(filepath)
    if err != nil {
        panic(err)
    }

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

我遇到的问题是,一旦我离开 Open 方法,fp 和 csv 的指针就会返回到 null。对该类的后续调用将引发 nil 错误。可以找到一个完整的例子 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)显示它按预期工作。我仍然很困惑为什么第一种方法不起作用。我猜我对结构、指针和/或延迟的工作方式有误解。我错过了什么?

最佳答案

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

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

you can check here for more info

希望对你有帮助

关于oop - 对如何在结构中保留 Golang 指针的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48039061/

相关文章:

mysql - 如何从数据库中解析时间

java - 即使对象属于子类,也会调用父类(super class)方法

c++ - 客户端服务器编程 - 写入缓冲区

php - 在接口(interface)(OOP)中添加属性是一个好习惯吗

c - 使用指向 char 的指针时出现段错误

postgresql - 我该如何解决 «panic : sql: unknown driver "postgres" (forgotten import? )»?

ruby - Ruby 中的符号是用构造函数还是初始化函数创建的?

c - 指针句大小写(C)

无法将地址传递给指针

go - 如何在同一循环内向 channel 发送值或从 channel 接收值?