登录
首页 >  Golang >  Go问答

在 Golang 面向对象编程中,无法在接收器结构中保存取消引用的指针

来源:stackoverflow

时间:2024-02-20 10:00:30 421浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《在 Golang 面向对象编程中,无法在接收器结构中保存取消引用的指针》,文章讲解的知识点主要包括,如果你对Golang方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。

问题内容

package main
import "fmt"

type rabbit struct {
    food string
}

func (r *rabbit) change_food() {
    (*r).food = "salad"
}

func main() {
    var roger rabbit = rabbit{food: "carrot"}
    (&roger).change_food()
    fmt.println(roger) //output --> salad

}

上面的代码可以工作,但是我想保存(在指针接收器中)变量中的指针取消引用而不是每次都写入(*r)不使用速记,因为在我看来,对于指针接收器来说,它们不清楚/令人困惑。我更喜欢显式取消引用以获得更清晰的代码https://tour.golang.org/moretypes/4

我尝试了这段代码:

package main

import "fmt"

type rabbit struct {
    food string
}

func (r *rabbit) change_food() {
    deref := *r //deref := (*r); var deref rabbit = (*r) also don't work
    deref.food = "salad"
}

func main() {
    var roger rabbit = rabbit{food: "carrot"}
    (&roger).change_food()
    fmt.println(roger) //output --> carrot. i wanted salad

}

致 mkopriva: 我不想使用 (*r) 形式,例如我现在使用内存地址:

package main

import "fmt"

type rabbit struct {
    food string
}

func (r *rabbit) change_food() {
    (*r).food = "salad"
}

func main() {
    var roger rabbit = rabbit{food: "carrot"}
    var p *rabbit = &roger
    p.change_food() //before It was (&roger).change_food(), now code is cleaner
    fmt.Println(roger) //output --> salad

}

正确答案


在调用方法和访问属性时,go自动在指针之间进行转换:

package main

import "fmt"

type rabbit struct {
    food string
}

func (r *rabbit) change_food() {
    r.food = "salad"
}

func main() {
    var roger = rabbit{food: "carrot"}
    roger.change_food()
    fmt.println(roger)
}

change_food 接收器接受一个指针,因此即使 roger 不是指针,go 也会自动处理它。

同样,即使 foodrabbit 的属性,而不是 *rabbit,go 也会认为这个手可以正确处理事情。

您不能取消引用指针,然后更改该指针地址处的数据。这就是指针存在的原因 - 因此您可以更改基础数据而不是传递副本。

如果这只是命名约定的问题,您始终可以使用 p 定义接收器的变量名称:

func (rp *rabbit) change_food() {
   ...

但是在 go 语言中这样表示指针类型并不常见,也许是因为 go 在输入方面比 c 等语言聪明得多,而且指针和值之间并没有真正混淆。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>