go中的接收器类型与结构体嵌套

go中的指针接收器与值接收器

在go语言中,方法的接收器类型有值和指针两种类型,值接收器跟指针接收器之间的区别在于,在指针接收器的方法内部的改变对于调用者是可见的,然而值接收器的情况不是这样的。通过一段代码来理解这点:

运行以上程序,打印出结果:

调用值接收器方法changeName想改变名字的时候是并不能在方法外改变名字的。当调用指针接收器方法changeAge改变年龄的时候,年龄变成51了,也就是方法内部改变了方法外的值,这就是值接收器跟指针接收器主要的区别。

通常情况下,由于changeAge方法有一个指针接收器,所以我们使用(&e) 来调用这个方法。其实没有这个必要,Go语言让我们可以直接使用 e.changeAge(51)。 e.changeAge(51)会自动被Go语言解释为(&e).changeAge(51)。

不过,这并非本文讨论的重点。本文想着重讨论的是在结构体继承的时候,结构体嵌套了指针类型将是怎样的一种情况。

通过类型组合达到继承

在go语言中,由于没有类的概念,但可以通过类型的组合来实现跟其他语言面向对象的效果。比如,在一个结构体成员中嵌入其他结构体,就相当于继承了该结构体,可以使用该结构体的方法。下面通过一段代码来体验一下。

上面的代码中Child结构体中嵌入了Father结构体,类似于php中的Child类继承了Father类。当Child的对象c调用了父类的Grow方法之后,age值由30变成了31,但Father类的age并没有改变。打印结果:

下面对Child 中的成员变量做一个改变,把Father改成指针类型*Father.

在上面的程序中,由于Child中嵌套了Father的指针类型,所以改了Child中成员变量的值对Father是可见的。当调用了c.Grow()方法,Child中的age变成了31,Father中的age也变成了31,打印结果如下:

这种写法在开发中非常常见,封装了一个底层公共类和一个业务类,希望在业务调用底层的方法的时候能根据业务的一些配置得到想要的结果。

发表评论

电子邮件地址不会被公开。 必填项已用*标注