后端基础Day2 关于Go的OOP体系 | 青训营笔记

107 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天.

由于这几天稍忙, 青训营视频课程进度较慢(甚至错过了签到), 所以接着第一天的Golang基础继续讲--Golang的面向对象体系结构, 方便后期对项目架构的深入理解.

前言

在Day1的基础语法学习中, 我们看到Golang语言的先进性, 包括其对顺序编程的独特设计, 对传统的以Java为代表的纯种OOP语言的OOP特性的部分摒弃和吸收, 对以Erlang为代表的消息是编程的特性的吸收(体现为go关键字和在语言层面对携程的支持).

我们可以得出一个粗糙的结论--Go是支持OOP和高并发的, 比C++更好的C语言

纯正的值传递

Go语言的OOP独特特点:

①Go语言中的大多数类型都是值语义(值传递),并且都可以包含对应的操作方法。 Go语言中类型的值语义表现得非常彻底(数组也是值传递)

var a = [3]int{1, 2, 3}
var b = a
b[1]++
fmt.Println(a, b)  //1 2 3    1 3 3 即不修改原来的a

为了使用引用传递, 则必须将b变成指针类型

var a = [3]int{1, 2, 3}
var b = &a

②实现某个接口时,无需从该接口继承(事实上,Go语言根本就不支持面向对象思想中的继承语法), 只需要实现该接口要求的所有方法即可。此即Golang最显著的特点之一--非侵入式接口

③任何类型都可以被Any类型引用。Any类型就是空接口,即interface{}。

匿名组合

Golang中的"继承"被称为匿名组合, 从词义上来看, 确实类似C语言的结构体组合.

类似于OOP中的继承, 其中Foo类继承了Base类并重写了Base类的Bar()方法, 调用的是Foo的成员Base的方法在继承中, 如果没有改写成员方法, 则方法被继承.

type Base struct {
	Name string
}
func (base *Base) Foo() { ... }
func (base *Base) Bar() { ... }
type Foo struct {
	Base
	...
}
func (foo *Foo) Bar() {
	foo.Base.Bar()
}

明天讲一讲接口吧

如果只能选择一个Go语言的特性移植到其他语言中,我会选择接口。 --Go语言的主要设计者之一 罗布·派克(Rob Pike)