Go语言中的this *Type用法

对象值传递是会复制一个对象副本,更改副本对象不会导致原对象改变。引用传递是会把对象的指针或者地址传递过去,修改引用对应的对象,会导致原有的对象改变。

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

猜你喜欢

转载自blog.csdn.net/lzufeng/article/details/86495143
今日推荐