对象值传递是会复制一个对象副本,更改副本对象不会导致原对象改变。引用传递是会把对象的指针或者地址传递过去,修改引用对应的对象,会导致原有的对象改变。
package main
import "fmt"
type Circle struct{
radius float64
}
/**
c Circle这种方式是按照值传递,会复制一个对象,调用getArea不会对原来的对象属性产生影响
*/
func (c Circle) getArea() float64{
var result =3.14*c.radius*c.radius
c.radius=0.0
return result
}
/**
this是按照引用传递,调用getArea2的时候,如果对对象的属性做了改变,会反映到原对象上
*/
func (this *Circle) getArea2() float64{
var result =3.14*this.radius*this.radius
this.radius=0.0
return result
}
func main(){
var c1 Circle
c1.radius=10.00
fmt.Printf("c1.radius: %f \n",c1.radius)
//输出 c1.radius: 10.000000
fmt.Printf("c1.getArea: %f \n",c1.getArea())
//输出 c1.getArea: 314.000000
fmt.Printf("c1.radius: %f \n",c1.radius)
//输出 c1.radius: 10.000000
//可以看到,调用getArea()方法后,并没有把c1对象的属性radius的值改变,因为调用方法的时候会复制一个c1对象,不会改变c1本身
fmt.Printf("c1.radius: %f \n",c1.radius)
//输出 c1.radius: 10.000000
fmt.Printf("c1.getArea2: %f \n",c1.getArea2())
//输出 c1.getArea2: 314.000000
fmt.Printf("c1.radius: %f \n",c1.radius)
//输出 c1.radius: 0.000000
//可以看到,调用getArea2()方法后,把c1对象的属性radius的值改变了
}
参考文章:https://blog.csdn.net/gavin_new/article/details/80268905