关于go语言的方法和指针类型方法区别.

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func (p Person) a1() string {
    return fmt.Sprintf("%v (%v years)", p.Name, p.Age)
}

func (p *Person) a2() string {
    return fmt.Sprintf("%v (%v years)", p.Name, p.Age)
}

func main() {
    a := Person{"Arthur Dent", 42}
    z := &Person{"Zaphod Beeblebrox", 9001}
    fmt.Println(a.a1(), z.a2())
}

想请教一下,p Person 是把方法放到值类型上,而p Person是放到指针上(不知道有没错,在自学中),那么那么为啥要分p Person,p Person,统一放p Person不行吗?或者什么应用场景下用p *Person,什么场景下用p Person### 题目描述

题目来源及自己的思路

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

你期待的结果是什么?实际看到的错误信息又是什么?

阅读 1.8k
2 个回答

当你需要修改 p 的时候要调用 func (p *Person) a2() string 指针类型的函数
如果你调用 func (p Person) a2() string 这样的方法是修改不成功的,因为调用时使用的是 p 的一个 copy

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func (p Person) show() {
    fmt.Printf("%v (%v years)", p.Name, p.Age)
}

func (p Person) modify1() string {
    p.Age = 38
}

func (p *Person) modify2() string {
    p.Age = 38
}

func main() {
    a := Person{"Arthur Dent", 42}
    a.show()
    a.modify1()
    a.show()
    a.modify2()
    a.show()
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题