背景:
面向对象编程时当前开发的设计思想,虽然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会直接导致全局修改,在外部是深拷贝的方式(并不是采用的内存共享)。相反如果是非指针类型,那就是采用的是不同的内存空间,仅仅是浅拷贝方式进行。这样就可以根据自己的需求进行相关的设计。