开篇论:世间万物,皆为对象!
一、缔造世界(了解认识)
1. 世界构思(结构体)
身边万物,都有其特性、功能和相互依赖关系!而我们所要思想的,就是抽丝剥茧,进行思想提纯、去杂质。
比如狗的品种:法国斗牛犬、拉布拉多寻回犬、金毛寻回犬、、、这些各种品种,都有共同的特点:鼻子特别灵敏,作用看家护院等!那么他们的关系呢?是不是都是从狼进化过来的呢?
好了,本小节的目的,就是想告诉大家,世间万物皆有品性和功能,都有相互依赖关系,而非凭空而来!!!
2. 静态世界(属性)
第一步,我们先进行构建静态的世界,什么是静态的世界呢?就是目之所及,皆为静态!
比如:树木–树的叶子颜色、太阳–太阳温度
这些如何出现在go的世界
package main
// Tree 树结构
type Tree struct {
// 树叶为绿色
leafColor string
}
// Sun 太阳结构
type Sun struct {
// 太阳的温度
sunTemperature int
}
其中有一些共性的关键词如下:
- type 关键字用于定义新的数据类型
- Sun 是结构体的名称,遵循大写字母开头的命名规范(表示可导出)
- struct 关键字表示这是一个结构体类型
到这里,我们知道了,如果想表达一种物品,使用struct进行构建
3. 添加生机(方法)
构建世界的目的,不是一成不变的静态,而是具有生机的循环体!
首先,让我们给数目赋予制造氧气的功能
package main
type TreeNode struct {
// 树木数量
number int
// 树木年龄
age int
}
// 树木一共生产氧气量
func (treeNode TreeNode) generateOxygen() int {
// 比如氧气制造逻辑如下:
oxygen := treeNode.number * treeNode.age
return oxygen
}
定义方法和定义函数非常相似
func (自定义绑定名称 绑定结构体) 方法名称(形参列表) (返回值列表) {
执行语句
return 返回值列表
}
是不是和函数定义上就多了一个绑定结构体,这也就是俩者的名字区别的界限!
在方法体内,进行使用结构体的变量时,都是通过绑定定义的名称,进行调用属性
二、golang面向对象编程(深入探索)
通过第一小节,我们从现实世界中,通过go进行构建万物的过程,接下来深入探索挖掘、、、
1. golang面向对象说明
作为一门面向对象编程语言,说明下和其它面向对象编程语言的区别
- Golang 支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说 Golang 支持面向对象编程特性是比较准确的。
- Golang 没有类(class),Go 语言的结构体(struct)和其它编程语言的类(class)有同等的地位,你可以理解 Golang 是基于 struct 来实现 OOP 特性的。
- Golang 面向对象编程非常简洁,去掉了传统 OOP 语言的继承、方法重载、构造函数和析构函数、隐藏的 this 指针等等
- Golang 仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它 OOP 语言不一样,比如继承 : Golang 没有 extends 关键字,继承是通过匿名字段来实现。
- Golang 面向对象(OOP)很优雅,OOP 本身就是语言类型系统(type system)的一部分,通过接口(interface)关联,耦合性低,也非常灵活。
2. 结构体关系示意图
说了这么多,一张图画一下,一图胜千言啊!

3. 字段/属性
字段是结构体的一个组成部分,一般是基本数据类型、数组,也可是引用类型。
声明和使用注意事项:
- 字段声明语法同变量,示例:字段名 字段类型
- 字段的类型可以为:基本类型、数组或引用类型
- 在创建一个结构体变量后,如果没有给字段赋值,都对应一个零值(默认值)
布尔类型是 false ,
数值是 0,
字符串是""。
数组类型的默认值和它的元素类型相关,比如 score [3]int 则为[0,0,0]指针,
slice,和 map 的零值都是 nil ,即还没有分配空间。
比如根据上边图进行声明狗的属性
package main
type Dog struct {
// 年龄
age int
// 颜色
color string
}
结构体都是相互隔离的,比如你修改狗的颜色,猫的结构体值,不会发生改变,是不是觉得本该如此!!!
4. 方法/行为
结构体除了声明字段外,还需要声明方法,比如:狗会游泳,会吃饭等
Golang 中的方法是作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型,都可以有方法,而不仅仅是 struct。
// 狗会游泳
func (dog Dog) swim() {
fmt.Println("年龄", dog.age, "颜色", dog.color, "Dog is swimming")
}
// 狗会吃饭
func (dog Dog) eat() {
fmt.Println("年龄", dog.age, "颜色", dog.color, "Dog is eating")
}
Dog除了声明属性,还进行了绑定方法
5. 结构体调用
初始化结构体,并进行调用
func main() {
//创建方式一
var dog1 Dog
dog1.age = 10
dog1.color = "white"
dog1.swim()
fmt.Println(dog1.age, dog1.color)
// 年龄 10 颜色 white Dog is swimming
// 10 white
// 创建方式二
//var dog2 Dog = Dog{}
dog2 := Dog{}
dog2.age = 11
dog2.color = "Black"
dog2.swim()
fmt.Println(dog2.age, dog2.color)
// 年龄 11 颜色 Black Dog is swimming
// 11 Black
// 创建方式三-结构体指针
//var dog3 *Dog = new(Dog)
dog3 := new(Dog)
dog3.age = 12
dog3.color = "Yellow"
dog3.swim()
fmt.Println(dog3.age, dog3.color)
// 年龄 12 颜色 Yellow Dog is swimming
// 12 Yellow
// 创建方式四-结构体指针
var dog4 *Dog = &Dog{}
dog4.age = 13
dog4.color = "Green"
dog4.swim()
fmt.Println(dog4.age, dog4.color)
// 年龄 13 颜色 Green Dog is swimming
// 13 Green
}
平常开发过程中,使用方式二即可,其它需要知道有这个方式创建
附
本篇从现实角度进行出发,进行延申到golang的世界!
从静态观察(属性)入手,进行扩展到动态(方法)的交互,完善struct结构体内容!
有了了解后,又进行了单独的属性/方法拆分深度探索、、、
希望本篇内容对你有启发^ v ^






