Golang学习之---面向“对象”编程(struct结构体、方法、工厂模式)(五)

一、面向“对象”编程

一个程序就是一个世界。

1、Golang语言面向对象编程说明

  • ①、Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说:Golang支持面向对象编程特性是比较准确的。
  • ②、Golang没有类class,取而代之的是结构体struct。可以这样理解:Golang是基于struct来实现OOP特性的。
  • ③、Golang面向对象编程非常简洁,去掉了传统的OOP语言的继承(继承并不是去掉了,而是通过匿名字段实现)、方法重载、构造函数和析构函数、隐藏的this指针等。
  • ④、Golang仍然有面向对象编程的继承、封装和多态的特性,只是实现方式和其他OOP语言不一样。比如:继承:Golang没有extends关键字,是通过匿名字段来实现的。
  • ⑤、Golang面向对象OOP很优雅,而OOP本身就是语言类型系统(type system)的一部分,通过接口(interface)关联,耦合性低。也非常灵活。也就是说Golang中面向接口编程是非常重要的特性。

2、结构体struct

2.1、基本介绍

①将一类事务的特性提取出来,形成一个新的数据结构,就是一个结构体
②通过这个结构体,我们可以创建多个变量/实例/对象。我们一般称为  结构体变量
③结构体中的字段/属性/field,我们这里称为字段。字段是结构体的一个组成部分。

2.2、结构体变量(实例)在内存中的布局(重要)

2.3、字段/属性

在创建一个结构体变量后,如果没有给字段赋值,都会默认有一个零值。
布尔类型默认值false,数值是0,字符串是""
数组类型的默认值和它的元素类型有关,比如score [3]int 则为[0, 0, 0]
指针,slice和map的零值都是nil,即还没有分配空间。需要new或make分配空间后才能赋值才能使用

2.4、使用注意事项:
(四)不同结构体变量的字段是独立的,互不影响。一个结构体变量字段的更改,不影响另一个,因为:结构体是值类型,进行的是值拷贝。例:

2.5、创建结构体变量和访问结构体字段


  • 从上面可以看出:
  • 1、第3种和第4种方式返回的是 结构体指针
  • 2、结构体指针访问字段的标准方式是:(*结构体指针).字段名,比如:(*p4).Name = "小妖"
  • 3、但Go开发设计者做了一个简化,也支持 结构体指针.字段名,比如:p4.Name = "小妖",更加符合程序员使用的习惯。Go编译器底层对 p4.Name 做了转化 (*p4).Name
  • 4、括号一定要加,因为:.运算符的优先级顺序高于*,要先执行(*p4)取值再执行.

2.6、内存分配机制


3、方法

3.1 基本介绍

Golang中的方法是作用在指定的数据类型上的。(即和指定的数据类型绑定
如:可以和结构体(包含字段和方法)、自定义类型Golang数据类型等绑定

3.2 方法的调用和传参机制原理

方法的调用和传参机制和函数基本一样,不同的地方是:方法调用时,会将调用方法的变量当作实参也传递给方法(如果变量是值类型,则进行值拷贝;如果变量是引用类型,则进行引用拷贝)。

3.3 方法的使用注意事项和细节

  • (1)结构体类型是值传递,在方法调用中遵守值传递的传递机制,是值拷贝传递方式
  • (2)如果程序员希望直接修改结构体变量的值可以通过结构体指针的方式来处理
  • (5)如果一个类型实现了String()这个方法,那么fmt.Println默认会调用这个变量的String()进行输出

3.4 方法和函数的区别 

  • ① 调用方式不一样
    函数的调用方式 :函数名(实参列表)
    方法的调用方式 :和方法绑定的变量.函数名(实参列表)  -- 可以是结构体变量,自定义变量,int float64变量等和方法绑定的变量
  • ② 对于普通函数,接收者为值类型时,不能将指针类型的数据直接传递,反之亦然
  • ③对于方法,接收者是值类型时,可以直接用指针类型的变量调用方法,反之亦然。因为对于方法,Go编译器底层会处理是否加上或者去掉(*.Name)

    从上图可以看出:
  • 对于方法来说,真正决定是值拷贝还是地址拷贝,看和这个方法是哪个数据类型绑定的。

四、声明结构体变量的几种写法
 

五、工厂模式

Golang的结构体中没有构造函数,通常使用工厂模式来解决这个问题。

5.1 业务场景


场景一、这里Student的首字母S是大写的,如果我们想在其他包创建Student的实例变量。引入model包后就可以创建了。

场景二、但问题来了,如果结构体首字母是小写的,就不行了,怎么办呢?---》工厂模式来解决

场景三、如果结构体的字段首字母也是小写的,如何在其他包中访问呢?---》提供对外的get和set方法来解决

猜你喜欢

转载自blog.csdn.net/qq_37358143/article/details/107493964