GO之面向对象编程注意事项是否引用类型做参数

背景:

        面向对象编程时当前开发的设计思想,虽然Go语言并不是面向对象编程语言,但是可以通过编程设计实现面向对象的编程效果。下面不是讲解如何设计出面向对象编程,而是去说明一下,如何选择使用指针类型还是普通数据类型进行函数实现,了解本质去选择。

1.  采用的是普通数据类型:

type User struct {
	Name string
	Age  int
}

type A interface {
	Hello()
}
// 采用的是普通数据类型
func (n User) Hello() {       
	fmt.Println("-------1111111-------", n.Name, n.Age)
	n.Name = "LHD"
	n.Age = 18
	fmt.Println("-------2222222-------", n.Name, n.Age)
}
func Test2(t *testing.T) {
	var a User
	a.Age = 20
	a.Name = "GCG"
	fmt.Println("---------更改之前---------", a)
	a.Hello()
	fmt.Println("---------更改之后---------", a)
}

运行结果:

=== RUN   Test2
---------更改之前--------- {GCG 20}
-------1111111------- GCG 20
-------2222222------- LHD 18
---------更改之后--------- {GCG 20}
--- PASS: Test2 (0.00s)
PASS

2.  采用指针数据类型

type User struct {
	Name string
	Age  int
}

type A interface {
	Hello()
}
// 使用指针数据类型
func (n *User) Hello() {
	fmt.Println("-------1111111-------", n.Name, n.Age)
	n.Name = "LHD"
	n.Age = 18
	fmt.Println("-------2222222-------", n.Name, n.Age)
}
func Test2(t *testing.T) {
	var a User
	a.Age = 20
	a.Name = "GCG"
	fmt.Println("---------更改之前---------", a)
	a.Hello()
	fmt.Println("---------更改之后---------", a)
}

运行结果:

=== RUN   Test2
---------更改之前--------- {GCG 20}
-------1111111------- GCG 20
-------2222222------- LHD 18
---------更改之后--------- {LHD 18}
--- PASS: Test2 (0.00s)
PASS

总结:

        通过上面两种的比较可以看出指针数据类型的话,在Hello函数类型内修改了变量User会直接导致全局修改,在外部是深拷贝的方式(并不是采用的内存共享)。相反如果是非指针类型,那就是采用的是不同的内存空间,仅仅是浅拷贝方式进行。这样就可以根据自己的需求进行相关的设计。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值