前言

编程就是要通过编程语言表达给计算机,让计算机帮助我们达到解决现实生活问题的目的!

不管是Python还是Golang...这些编程语言,由于历史原因、遇到的痛点、解决的问题不同,导致语法追求、本身特性不同。但是遇到的问题、解决问题的思想是一致的。

 

面向对象编程 :就是按照自己的理解 尽量把程序里出现的所有东西   抽象得划分为1个个的不同的分类,这些分类中包含自身独有的数据、也有自己独特的方法!

 

 

如果想要开发1款游戏,游戏中的人物不仅有角色属性、也有交易、攻击这些作为。

单纯得使用数据类型int、string ..函数去表示1个人物,复杂不利于代码灵活、扩展,于是想办法如何把数据和方法集合到1块进行表示。

Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。

Go语言中通过结构体的内嵌再配合接口  比面向对象具有更高的扩展性和灵活性。

 结构体:就是可以把多种不同的基本数据类型,封装到1个整体里面。在golang中这个整体称为结构体。

 

自定义类型

自定义类型可以对Go中现有的数据类型的方法进行扩展

 在Go语言中我们无法直接对在其他包中定义的结构体添加方法,但是可以通过类型别名的方式迂回到达目的。

 

类型别名

 

结构体声明

structure结构:顾名思义肯定是由不同的东西组合而成。

在我们写代码的时候如果 需要定义1个由多个基本数据类型组成的数据类型时(例如人有性别string、年龄uint8、爱好得有多个[]string、吃、喝、拉、撒、睡、学习、工作func)创造这种具有多维度的属性时的物时,无法使用单一的数据类型表示全面,所有我们只能使用结构体。

 

结构体的语法

typestruct

 

定义1个简单的结构体

  

匿名结构体

在Go语言中如果我们一次性使用结构体的话, 还可以定义 匿名的结构体。

 

方式2

  

 

创建指针类型结构体

Go中的结构体不同于Python的class,它是值类型不可以被修改要修改可以用指针,所以Python里面没有指针,使用copy、 deep copy。

  

通过指针创建1个可以字段可以被修改的结构体

  

结构体初始化

Go中结构体初始化的方式很多主要有变量赋值、构造函数初始化2种方式,于Python不同的是go中没有自带构造方法,需要自己构建。

 

实例化

 

 

构造函数初始化结构体

构造函数 就是1个构造X种结构体变量的函数,其用意是通过 1个函数反复生成某种结构体的变量,提升代码的重用性。

使用变量初始化结构体的方式会造成代码的冗余,我么可以使用一个构造函数来完成struct的初始化。

struct的构造函数约定俗成以 new开头,自定义1个构造函数可以返回1个值类型的struct, 如果1个struct内部字段存储的数据量很大,重复copy造成内存开销过大。也可以返回1个指针类型的struct。

匿名字段struct

模拟继承

利用Go的struct可以嵌套struct,当前struct中没有的字段    自动去嵌套了struct的匿名字段中查找的特性,实现继承的效果。

  

  

 

结构体内存布局

结构体占用一块连续的内存。

 

  

 

struct的方法和接受者

前面的struct中我只是封装了数据,那么我想对struct中的这些数据进行操作呢?就需要给struct绑定上1个方法。

方法(Method)
接收者(Receiver)thisself

Go里面接收者(某1个数据类型)+方法 这套语法,实现了类似于Python类中的方法!

方法和函数的不同是函数不从属于任何数据类型,而方法作用于某种数据类型。 

 

语法

原来Go的函数名前面还可以指定接收者

 

值类型的接受者

接受者必须指定某1个数据类型

  

 指针类型的接受者

 接受者还可以为 某种数据类型的指针,接受者为数据类型指针时就实现了对struct 字段的修改。

 

任意类型添加方法 

int32

 

 

结构体序列化

"":,

 

序列化和反序列化

 

复杂json结构

 

 

在golang中我们不仅可以把json转换成结构体,还可以把json转换成map类型。

 

 

 

结构体实现链表

链表反转

  

  

 

 

 

 

 

 

 

 

 

练习 

 

员工管理函数版

  

员工管理面向对象版

 

 

 manage_unit.go

main.go