(p Person) 和 (p *Person) 到底是什么区别?

type Person struct {
    // 属性
    name string 
    age int 
    sex bool 
    hobby []string
}

// 方法
func (p Person)Eat() {
    fmt.Println("eat...")
}

func (p *Person)Eat() {
    fmt.Println("eat...")
}



func main() {

    james := Person{} 

    james.Eat()
}

我知道(p *Person) 是在使用方法时候传入的是指针,(p Person)使用方法时候传入的是对象。

也就是说,james.Eat() 这个时候,james基于方法上面p的类型,使用方法时候传递对象或者指针吗?

阅读 2.4k
2 个回答

1.receiver类型为T只包含T的方法集,receiver类型为T包含T和T的方法集
2.receiver类型为T的实例,实参是个copy,而类型为*T实参是个指针

比如你在(p *Person)里面把p的age改成100, 你方法外面的p也会被修改.

(p Person)里面把p的age改成100, 这个时候发生了一次p的拷贝,你外面的p是不变的.

除非你很明确可以写成(p Person),一般都不写成这样的.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题