- func(p *Person) Eat(){…} 使用指针和值都可以调用,尽量使用指针。
- 无论使用值还是指针做主语,去访问属性和方法,其功能是一致的;
- 定义方法时,方法的主语尽量使用指针,一方面是模仿SDK,一方面是最大程度地减少值传递的拷贝效应的负面影响。
- 做主语时,使用值或者指针时效果一致,但!做参数时,一个是拷贝式值传递,一个是地址引用传递;
- 对象做参数时,值传递是拷贝式的;引用传递(指针传递、地址传递)才是传递真身;
- 在整个OOP的世界里面,值能做的,指针都能做。反之不成立。
- 创建对象的方式一共四种 ①:创建空白对象 Person{} ②:创建对象时,有选择地给指定属性赋值:Person{Age:20,Name:“张三”} ③:创建对象时,完整有序的给所有属性赋值:p := Person(“张三”,20,true,[]string{“撸代码”,“完美的撸代码”}) ④:通过内建函数创建对象指针 pPtr := new(Person)
- new(Type)*Type用于构建结构体的实例指针,参数是结构体的名字,返回的是【所有属性都为默认值的对象】的指针
- 大牛逼货的命名能够深度的望文生义 例如:personPtr能够知道它是一个Person对象的指针而非实例
- 类型名称大写开头,外部包可以创建它的对象,反之则不能;
- 属性名和方法名大写开头,外部包可以通过实例或指针进行访问,反之则不能;
- 对接口的实现,语法上一定要严格区分到底是实例实现了接口还是指针实现了接口;
- 对接口实例(worker)的类型断言,只能断言为实例或指针中的一种,具体取决于【到底是实例实现了接口还是指针实现了接口】
- Worker是接口,workers := make([]Worker,0)能把实例a丢入workers,意味着a必须是实现了Worker接口的子类实例或指针;
- 只要a是接口Worker的实例,就可以workers:=append(workers,a) 也可以:var worker = a.
- 如果指针实现了接口,那么只有指针对象才是接口实例;
- 接口实例只认指针。
- 不管实现接口方法的主语是指针还是值!类型断言也只能断言为指针!
【Go】面向对象重难点总结
2021-09-16 11:26:04
浏览数 (2)