Go的方法接收: 值接收与指针接收

kyaa111 1年前 ⋅ 255 阅读
package main

import "fmt"

type Circle struct {
	r uint
}

func (c *Circle) add() uint {
	c.r++
	return c.r
}

func (c Circle) show() uint {
	c.r++
	return c.r
}

func main() {
	c := Circle{1}
	fmt.Printf("result: %d\n", c.show())
	fmt.Printf("result: %d\n", c.add())
}

output

result: 2 result: 2

package main

import "fmt"

type Circle struct {
	r uint
}

func add(c *Circle) uint {
	c.r++
	return c.r
}

func show(c Circle) uint {
	c.r++
	return c.r
}

func main() {
	c := Circle{1}
	fmt.Printf("result: %d\n", show(c))
	fmt.Printf("result: %d\n", add(&c))
}

output

result: 2
result: 2

在Go或C++等很多面向对象的编程语言中, 对象方法的第一个参数的类型就是当前对象指针

在Go中, 参数是值传递的, 指针的值传递只是地址的拷贝, 而对象则要拷贝内部的所有属性, 存在一定的性能消耗, 且由于方法内部操作的是拷贝对象, 对原对象不会有任何影响