[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++中继承的概念,但是他有一个类似功能的结构嵌入
简单的结构体声明和使用。

相关文章
|
11天前
|
程序员 Go PHP
为什么大部分的 PHP 程序员转不了 Go 语言?
【9月更文挑战第8天】大部分 PHP 程序员难以转向 Go 语言,主要因为:一、编程习惯与思维方式差异,如语法风格和编程范式;二、学习成本高,需掌握新知识体系且面临项目压力;三、职业发展考量,现有技能价值及市场需求不确定性。学习新语言虽有挑战,但对拓宽职业道路至关重要。
42 10
|
2天前
|
Shell Go API
Go语言grequests库并发请求的实战案例
Go语言grequests库并发请求的实战案例
|
9天前
|
Go API 开发者
深入探讨:使用Go语言构建高性能RESTful API服务
在本文中,我们将探索Go语言在构建高效、可靠的RESTful API服务中的独特优势。通过实际案例分析,我们将展示Go如何通过其并发模型、简洁的语法和内置的http包,成为现代后端服务开发的有力工具。
|
11天前
|
算法 程序员 Go
PHP 程序员学会了 Go 语言就能唬住面试官吗?
【9月更文挑战第8天】学会Go语言可提升PHP程序员的面试印象,但不足以 solely “唬住” 面试官。学习新语言能展现学习能力、拓宽技术视野,并增加就业机会。然而,实际项目经验、深入理解语言特性和综合能力更为关键。全面展示这些方面才能真正提升面试成功率。
35 10
|
11天前
|
编译器 Go
go语言学习记录(关于一些奇怪的疑问)有别于其他编程语言
本文探讨了Go语言中的常量概念,特别是特殊常量iota的使用方法及其自动递增特性。同时,文中还提到了在声明常量时,后续常量可沿用前一个值的特点,以及在遍历map时可能遇到的非顺序打印问题。
|
9天前
|
存储 监控 数据可视化
Go 语言打造公司监控电脑的思路
在现代企业管理中,监控公司电脑系统对保障信息安全和提升工作效率至关重要。Go 语言凭借其高效性和简洁性,成为构建监控系统的理想选择。本文介绍了使用 Go 语言监控系统资源(如 CPU、内存)和网络活动的方法,并探讨了整合监控数据、设置告警机制及构建可视化界面的策略,以满足企业需求。
26 1
|
15天前
|
安全 大数据 Go
深入探索Go语言并发编程:Goroutines与Channels的实战应用
在当今高性能、高并发的应用需求下,Go语言以其独特的并发模型——Goroutines和Channels,成为了众多开发者眼中的璀璨明星。本文不仅阐述了Goroutines作为轻量级线程的优势,还深入剖析了Channels作为Goroutines间通信的桥梁,如何优雅地解决并发编程中的复杂问题。通过实战案例,我们将展示如何利用这些特性构建高效、可扩展的并发系统,同时探讨并发编程中常见的陷阱与最佳实践,为读者打开Go语言并发编程的广阔视野。
|
13天前
|
存储 Shell Go
Go语言结构体和元组全面解析
Go语言结构体和元组全面解析
|
18天前
|
Go
golang语言之go常用命令
这篇文章列出了常用的Go语言命令,如`go run`、`go install`、`go build`、`go help`、`go get`、`go mod`、`go test`、`go tool`、`go vet`、`go fmt`、`go doc`、`go version`和`go env`,以及它们的基本用法和功能。
26 6
|
18天前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
19 3