[GO专栏-2]Go语言的设计哲学

简介: [GO专栏-2]Go语言的设计哲学

[GO专栏-2]Go语言的设计哲学
简单
第一条原则:追求简单,少即是多
组合
偏好组合,正交解耦
理解golang的结构体嵌入
为什么嵌入语法是组合而非继承
活用组合和接口让代码更加优雅
与其他语言对比
并发
原生并发,轻量高效
Go 语言为开发者提供的支持并发的语法元素和机制
并发原则对 Go 开发者在程序结构设计层面的影响
面向工程
原则: 面向工程,“自带电池”
语言
标准库
工具
💫点击直接资料领取💫
简单
第一条原则:追求简单,少即是多
所谓大道至简,就是这个道理,语言终归只是个工具,能用简单的方式处理问题为什么要复杂起来呢?
本人深有体会最深的就是当年做c++的时候,看STL的源码,那变量命名,又臭又长一堆下划线,根本让人看不懂,或许有人会说,那是你技术太菜,看不懂大神写的代码,我的理解正好相反,写成这样的代码,真的是大神吗?或者把源码写的让人看不懂就是大神了吗?
所以个人很喜欢go的简单,用着简单,定义简单,自带的标准库源码容易阅读,看着简单等等。
和那些通过相互借鉴而不断增加新特性来吸引程序员眼球的主流编程语言相比,比如 C++、Java 等,Go 的设计者们在语言设计之初就选择拒绝走语言特性融合的道路,选择了“做减法”,选择了“简单”,他们把复杂性留给了语言自身的设计和实现,留给了 Go 核心开发组自身,而将简单、易用和清晰留给了广大 gopher 们。因此,今天呈现在我们在眼前的是这样一门 Go 语言:
简洁、常规的语法(不需要解析符号表),它仅有 25 个关键字。
内置垃圾收集,降低开发人员内存管理的心智负担。
没有头文件。
显式依赖(package)。
没有循环依赖(package)。
常量只是数字。
头母大小写决定可见性。
任何类型都可以拥有方法(没有类)。
没有子类型继承(没有子类)。
没有算术转换。
接口是隐式的(无需“implements”声明)。
方法就是函数。
接口只是方法集合(没有数据)。
方法仅按名称匹配(不是按类型)。
没有构造函数或析构函数。
n++和 n–是语句,而不是表达式。
没有++n 和–n。
赋值不是表达式。
在赋值和函数调用中定义的求值顺序(无“序列点”概念)。
没有指针算术。
内存总是初始化为零值。
没有 const 或其他类型注解语法。
没有模板/泛型。
没有异常(exception)。
内置字符串、切片(slice)、字典(map)类型。
内置数组边界检查。
内置并发支持。
组合
偏好组合,正交解耦
先说说组合与继承的概念。对设计模式有过了解的同学对这两个名词应该都有初步的理解,我们来总结一下:
官方解释就不说了,组合一般理解为 has-a 的关系,继承是is-a的关系,两者都能起到代码复用的作用。以java为例,组合可以理解为类里边包含一个其他类型的属性值,继承是extends。
这里我引用一篇文章的段落浅谈组合与继承:
继承的优缺点
优点:
1,类继承简单粗爆,直观,关系在编译时静态定义。
2,被复用的实现易于修改,sub可以覆盖super的实现。
缺点:
1,无法在运行时变更从super继承来的实现(也不一定是缺点)
2,sub的部分实现通常定义在super中。
3,sub直接面对super的实现细节,因此破坏了封装。
4,super实现的任何变更都会强制子类也进行变更,因为它们的实现联系在了一起。
5,如果在新的问题场景下继承来的实现已过时或不适用,所以必须重写super或继承来的实现。
由于在类继承中,实现的依存关系,对子类进行复用可能会有问题。有一个解决办法是,只从协议或抽象基类继承(子类型化),国为它们只对很少的实现,而协议则没有实现。
组合的优缺点
对象组合让我们同时使用多个对象,而每个对象都假定其他对象的接口正常运行。因此,为了在系统中正常运行,它们的接口都需要经过精心的设计。下面我就来说说他的优缺点
优点:
1,不会破坏封装,因为只通过接口来访问对象;
2,减少实现的依存关系,因为实面是通过接口来定义的;
3,可以在运行时将任意对象替换为其他同类型的对象;
4,可以保持类的封装以专注于单一任务;
5,类和他的层次结构能保持简洁,不至于过度膨胀而无法管理;
缺点:
1,涉及对象多;
2,系统的行为将依赖于不同对象间的关系,而不是定义于单个类中;
3,现成的组件总是不太够用,从而导致我们要不停的定义新对象。
总结来看,我认为,组合相对于继承的优点在于:
可以利用面向接口编程原则的一系列优点,封装性好,耦合性低。
相对于继承的编译期确定实现,组合的运行态指定实现,更加灵活。
组合是非侵入式的,继承是侵入式的。
理解golang的结构体嵌入
golang中是没有class的,但是有一个结构体struct,有点类似,他没有像java,c++中继承的概念,但是他有一个类似功能的结构嵌入
简单的结构体声明和使用。

相关文章
|
1天前
|
编译器 Go
go语言编译选项
【10月更文挑战第17天】
9 5
|
4天前
|
安全 Go 开发者
go语言并发模型
【10月更文挑战第16天】
18 8
|
1天前
|
缓存 安全 Java
go语言 代码优化
【10月更文挑战第17天】
11 4
|
1天前
|
设计模式 测试技术 Go
学习Go语言
【10月更文挑战第25天】学习Go语言
12 4
|
1天前
|
缓存 监控 算法
go语言
【10月更文挑战第25天】go语言
8 4
|
1天前
|
Java 程序员 Go
Go语言的开发
【10月更文挑战第25天】Go语言的开发
9 3
|
1天前
|
JSON 监控 安全
go语言选择合适的工具和库
【10月更文挑战第17天】
6 2
|
1天前
|
存储 算法 Java
Go语言的内存管理机制
【10月更文挑战第25天】Go语言的内存管理机制
6 2
|
4天前
|
安全 Java Go
go语言高效切换
【10月更文挑战第16天】
13 5
|
4天前
|
运维 监控 Go
go语言轻量化
【10月更文挑战第16天】
11 3