大家好,我是明哥。
由于某些不可抗力,之前该专栏的所有内容都被删除了。因此之后的一段时间内,我会重新发布这些文章,先给已经看过的关注者提个醒。
0. 什么是结构体?
在之前学过的数据类型中,数组与切片,只能存储同一类型的变量。若要存储多个类型的变量,就需要用到结构体,它是将多个容易类型的命令变量组合在一起的聚合数据类型。
每个变量都成为该结构体的成员变量。
可以理解为 Go语言 的结构体struct和其他语言的class有相等的地位,但是Go语言放弃大量面向对象的特性,所有的Go语言类型除了指针类型外,都可以有自己的方法,提高了可扩展性。
在 Go 语言中没有没有 class 类的概念,只有 struct 结构体的概念,因此也没有继承,本篇文章,带你学习一下结构体相关的内容。
1. 定义结构体
声明结构体
比如我要定义一个可以存储个人资料名为 Profile 的结构体,可以这么写
2. 定义方法
在 Go 语言中,我们无法在结构体内定义方法,那如何给一个结构体定义方法呢,答案是可以使用组合函数的方式来定义结构体方法。它和普通函数的定义方式有些不一样,比如下面这个方法
FmtProfile(person Profile)person.属性名完整代码如下:
输出如下
3. 方法的参数传递方式
上面定义方法的方式叫当你想要在方法内改变实例的属性的时候,必须使用指针做为方法的接收者。
*至此,我们知道了两种定义方法的方式:
- 以值做为方法接收者
- 以指针做为方法接收者
那我们如何进行选择呢?以下几种情况,应当直接使用指针做为方法的接收者。
- 你需要在方法内部改变结构体内容的时候
- 出于性能的问题,当结构体过大的时候
有些情况下,以值或指针做为接收者都可以,但是考虑到代码一致性,建议都使用指针做为接收者。
不管你使用哪种方法定义方法,指针实例对象、值实例对象都可以直接调用,而没有什么约束。这一点Go语言做得非常好。
4. 结构体实现 “继承”
为什么标题的继承,加了双引号,因为Go 语言本身并不支持继承。
但我们可以使用组合的方法,实现类似继承的效果。
在生活中,组合的例子非常多,比如一台电脑,是由机身外壳,主板,CPU,内存等零部件组合在一起,最后才有了我们用的电脑。
同样的,在 Go 语言中,把一个结构体嵌入到另一个结构体的方法,称之为组合。
现在这里有一个表示公司(company)的结构体,还有一个表示公司职员(staff)的结构体。
若要将公司信息与公司职员关联起来,一般都会想到将 company 结构体的内容照抄到 staff 里。
虽然在实现上并没有什么问题,但在你对同一公司的多个staff初始化的时候,都得重复初始化相同的公司信息,这做得并不好,借鉴继承的思想,我们可以将公司的属性都“继承”过来。
但是在 Go 中没有类的概念,只有组合,你可以将 company 这个 结构体嵌入到 staff 中,做为 staff 的一个匿名字段,staff 就直接拥有了 company 的所有属性了。
来写个完整的程序验证一下。
staffInfo.companyNamestaffInfo.company.companyName5. 内部方法与外部方法
在 Go 语言中,函数名的首字母大小写非常重要,它被来实现控制对方法的访问权限。
- 当方法的首字母为大写时,这个方法对于所有包都是Public,其他包可以随意调用
- 当方法的首字母为小写时,这个方法是Private,其他包是无法访问的。
好了,今天的文章就到这里了。
若今天的分享对你有帮助,不如点个赞,支持一下?