15、做中学 | 初二下期 Golang面向对象_基础

开篇论:世间万物,皆为对象!

一、缔造世界(了解认识)

1. 世界构思(结构体)

身边万物,都有其特性、功能和相互依赖关系!而我们所要思想的,就是抽丝剥茧,进行思想提纯、去杂质。
比如狗的品种:法国斗牛犬、拉布拉多寻回犬、金毛寻回犬、、、这些各种品种,都有共同的特点:鼻子特别灵敏,作用看家护院等!那么他们的关系呢?是不是都是从狼进化过来的呢?

好了,本小节的目的,就是想告诉大家,世间万物皆有品性和功能,都有相互依赖关系,而非凭空而来!!!

2. 静态世界(属性)

第一步,我们先进行构建静态的世界,什么是静态的世界呢?就是目之所及,皆为静态!

比如:树木–树的叶子颜色、太阳–太阳温度

这些如何出现在go的世界

package main

// Tree 树结构
type Tree struct {
	// 树叶为绿色
	leafColor string
}

// Sun 太阳结构
type Sun struct {
	// 太阳的温度
	sunTemperature int
}

其中有一些共性的关键词如下:

  1. type 关键字用于定义新的数据类型
  2. Sun 是结构体的名称,遵循大写字母开头的命名规范(表示可导出)
  3. 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面向对象说明

作为一门面向对象编程语言,说明下和其它面向对象编程语言的区别

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

2. 结构体关系示意图

说了这么多,一张图画一下,一图胜千言啊!
在这里插入图片描述

3. 字段/属性

字段是结构体的一个组成部分,一般是基本数据类型、数组,也可是引用类型。

声明和使用注意事项:

  1. 字段声明语法同变量,示例:字段名 字段类型
  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 ^

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值