多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] >[success] ## **1:Golang面向对象思想基本介绍** 1)Golang也支 持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是**纯粹的面向对象语言**。所以我们说**Golang支持面向对象编程特性**是比较准确的 2)Golang没有 类(class),Go语言的结构体(struct)和其它编程语言的类(class)有同等的地位,你可以理解Golang是基于struct来实现0OP特性的。 3)Golang面向对 象编程非常简洁,去掉了传统OOP语言的继承、方法重载、构造函数和析构函数、隐藏的this指针等等 4)Golang仍然有 面向对象编程的继承,封装和多态的特性,只是实现的方式和其它0OP语言不一样,比如继承: Golang没有 extends关键字,继承是通过匿名字段来实现 5)Golang面向对象(OOP)很优雅,OOP本身就是语言类型系统(type system)的一部分,通过接口(interface)关联,耦合性低,也非常灵活。后面同学们会充分体会到这个特点。也就是说在Golang中面向接口编程是非常重要的特性。 <br> <br> ### **1.1:案例演示** **养猫案例:** ![](https://img.kancloud.cn/cf/32/cf32e0a66a2478078102c016d4579668_982x720.png) <br> <br> ### **1.2:结构体和结构体变量区别和联系** 通过:上面的案例和讲解我们可以看出: 1)结构体是自定义的数据类型,代表一类事物. 2)结构体变量(实例)是具体的, 实际的,代表一个具体变量 **注意:sum就是一个具体的实例** <br> <br> ### **1.3:结构体变量在内存中的布局** ![](https://img.kancloud.cn/2f/64/2f64a2c9a0a973a7e129373929285a65_1153x720.png) <br> <br> ### **1.4:结构体声明** ``` type Cat struct{ Name string Age  int Color string } ``` 注意:**type和struct是关键字,Cat是结构体名称(也叫结构体变量),如果结构体的名称大写那么可以在其他包中使用,结构体里面的部分 Name 是(字段)变量名 string是变量名的类型,如果变量名大写,也可以在其他程序或包中使用** <br> <br> ### **1.5:字段/属性** 基本介绍 1)从概念或叫法上看结构体字段\=属性\=field (即授课中, 统一叫字段)案例演示 2)字段是结构体的一个组成部分,一般是基本数据类型、数组,也可是引用类型。比如我们前面定义猫结构体的Name string就是属性 <br> <br> ### **1.6:字段/属性注意事项** 1)如果结构体里面的也可以是,**指针**,**slice**,和map都是零值都是nil,即还没分配空间(需要make一下) 初始值如下: ![](https://img.kancloud.cn/09/08/0908e2057d38c18645f120be8793e8ad_1238x720.png) 2)在创建一个结构体变量后,如果没有给字段赋值,都对应一个**零值**(默认值),规则同前面讲的一样: . 布尔类型是false,数值是0,字符串是""。 数组类型的默认值和它的元素类型相关,比如score \[3\]int则为\[0, 0, 0\] **指针,slice, 和map的零值都是nil,即还没有分配空间。** 案例演示: ![](https://img.kancloud.cn/80/3f/803f16e98d2d26f40c7b6cde45e87fe9_761x720.png) <br> <br> 3)不同结构体变量的字段是独立,互不影响,一个结构体变量字段的更改,不影响另外一个。\[案例演示+图(Monster\] ![](https://img.kancloud.cn/c5/c6/c5c6b2c3848b0b431dd3bc855948fbd4_1032x720.png) 上面代码,内存示意图,下面的示意图是**值拷贝** ![](https://img.kancloud.cn/97/dd/97dd1c01916f18c7169eaa1c22d5b53a_1280x446.png) <br> <br> ### **1.7:创建结构体变量即使用访问字段** 1. 第一种方式在上面已经写过了 2. 第二种方式如下: ![](https://img.kancloud.cn/91/b8/91b882b47bddd821c619a2500b9aefba_1280x630.png) <br> 3. 第三种方式3-& var person \*Person = new (Person) ![](https://img.kancloud.cn/6a/44/6a443642a58e5f555ca2f45bc117a931_1280x645.png) 4. 第四种方式4-{} var person \*Person = &Person\[\] ![](https://img.kancloud.cn/3f/69/3f69d390ffe8a87b90259ebf07a5a9fe_1220x720.png) **说明:** 1)第3种和第4种方式返回的是结构体指针。 2)结构体指针访问字段的标准方式应该是: (\*结 构体指针).字段名,比如 (\*person).Name = "tom" 3)但go做了一个简化,也支持结构体指针.字段名,比如person.Name = "tom"。 更加符合程序员使用的习惯,go编译器底层对person.Name做了转化(\*person).Name <br> ### **1.8:匿名结构体** 在定义一些临时数据结构等场景下还可以使用匿名结构体。 ![](https://img.kancloud.cn/e0/a7/e0a7ac299168ed98ad083b86282648fa_1280x417.png) <br> ### **1.9:结构体的细节** 1)结构体的所有字段是连续的 ![](https://img.kancloud.cn/85/44/8544129e7204bb2ce305743fae3416e0_1280x630.png) <br> 2)结构体是用户单独定义的类型,和其它类型进行转换时需要有完全相同的字段名字、个数和类型) ![](https://img.kancloud.cn/05/e3/05e347d6071f94d54d9dede467cc582f_1205x720.png) <br> 3)结构体进行type重新定义(相当于取别名)golang认为是新的数据类型,**但是互相可以强转** ![](https://img.kancloud.cn/21/5d/215d4e77eaad3e2527739bacb2e7100d_1280x622.png) 4)struct 的每个字段上,可以写上一个tag,该tag可以通过反射机制获取,常见的使用场景就是序列化和反序列化。 * 序列化应用场景 ![](https://img.kancloud.cn/19/15/1915a9d0fc62b75c1865da7d61b9cc38_1280x320.png) <br> * 应用案例 ![](https://img.kancloud.cn/ef/45/ef45872097f8cfc4feb19ab55534b1f4_1280x481.png)