在结构“函数”中使用指针与复制

我是 Go 的新手,在编写结构“函数”时,我真的无法决定何时使用指针还是副本(这是正确的术语吗?)


type Blah struct {

    c complex128

    s string

    f float64

}


func (b * Blah) doPtr() {

    fmt.Println(b.c, b.s, b.f);

}


func (b Blah) doCopy() {

    fmt.Println(b.c, b.s, b.f);

}

现在,我的 C++ 背景告诉我doPtr在速度和内存方面都更有效率,但是doCopy除非您修改对象,否则很多示例都会使用,所以我错过了什么吗?


海绵宝宝撒
浏览 158回答 2
2回答

qq_笑_17

...另一个原因是这意味着该方法不需要获取指向结构的指针。这非常重要,因为它与 Go 类型系统的关系。如果通过接口调用方法,则只有当接口变量包含指针时,才能调用接受指针的方法。例如,您可以定义一个定义 Log() 方法的接口并创建一个这种类型的变量。然后,您可以将 Logger 结构的一个实例分配给该变量。您还可以将指向 Logger 结构实例的指针分配给该变量。两者都可以工作,因为 Log() 方法可以从结构的实例和指向实例的指针中调用。如果该方法接受一个指针参数,那么您只能在指针上调用它。因此,Go 中的好风格是只要求方法在修改结构时采用指针,或者如果结构太大以至于在每次方法调用时都无法复制它......
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go