文章目录
Go 的设计哲学看这一篇就够了
引言
-
这篇2017年的文章引发
看到 go-coding-in-go-way 引发深思:写着写着,就是发现自己写的代码总是感觉很别扭,并且总是尝试在Go语言中寻找自己上一门语言中熟悉的语法元素;自己的代码风格似乎和Go stdlib、主流Go开源项目的代码在思考角度和使用方式上存在较大差异 -
目标
学习和使用一门编程语言,目标就是要用这门语言思维方式去Coding。学习Go,就要用Go的编程思维去写Go代码,而不是用其他语言的思维方式。 -
前提是达成这样的共识
决定编程语言思维的根本在于这门编程语言的价值观!
什么是价值观?个人认为:一门编程语言的价值观就是这门语言的最初设计者对程序世界的认知。
思维和结构影响语言应用行为,这是语言应用的核心。
我们常用冰山表示一个事物的表象与内涵。如果说某种语言的惯用法idiomatic tips或者best practice这些具体行为是露出水面上的冰山头部,那么价值观和思维方式就是深藏在水面以下的冰山的基座。
-
Go价值观形成的因素
- Unix文化
- 基因遗传,CSP
- 面向新的基础设施环境和大规模软件开发的诸多问题
-
引用这篇作者总结的价值观
Overall Simplicity
一句话,在偏好并发环境下的简单概念的正交组合
- 结果呢?
一时用Go一时爽;一直用Go一直爽!
Go内置的testing framework、gofmt、Go pprof …工具的表现也是让你感觉用起来十分舒服
展开价值观
Overall Simplicity
- short naming thought(短命名思维)
- minimal thought(最小思维)
一种代码风格
显式代码
“一种”循环: for
“一种”constant
“一种”错误处理方法
Orthogonal Composition
- vertical composition thought(垂直组合思维):embedding
- small interface thought(小接口思维)
- horizontal composition thought(水平组合思维):接受interface类型参数的普通function进行组合
Preference in Concurrency
- “detached” goroutine
- “parent-child” goroutine
- service handle
- dispatch-and-mix goroutines
小结
再强调一下,只有当你使用Go编程思维去写Go code时,你才能体会到Go设计者的用意,才能让你没有别扭的赶脚,发现自己走在正确的way上,才能真正感到go coding时的fun。
收录优雅的形式
1、代码规范
2、最佳实践
-
目录结构遵循 Go 语言社区中被广泛达成共识的 目录结构,减少项目的沟通成本;
-
模块拆分:按照职责对不同的模块进行拆分,Go 语言的项目中也不应该出现 model、controller 这种违反语言顶层设计思路的包名;
-
显示与隐式:尽可能地消灭项目中的 init 函数,保证显式地进行方法的调用以及错误的处理;
-
面向接口:面向接口是 Go 语言鼓励的开发方式,也能够为我们写单元测试提供方便,我们应该遵循固定的模式对外提供功能;
使用大写的 Service 对外暴露方法;
使用小写的 service 实现接口中定义的方法;
通过 func NewService(…) (Service, error) 函数初始化 Service 接口;
3、单元测试:保证项目工程质量的最有效办法;
-
gomock:最标准的也是最被鼓励的方式;
-
sqlmock:处理依赖的数据库;
-
httpmock:处理依赖的 HTTP 请求;
-
monkey:万能的方法,但是只在万不得已时使用,类似的代码写起来非常冗长而且不直观;
-
可测试:意味着面向接口编程以及减少单个函数中包含的逻辑,使用『小方法』;
-
组织方式:使用 Go 语言默认的 Test 框架、开源的 suite 或者 BDD 的风格对单元测试进行合理组织;
-
Mock 方法:四种不同的单元测试 Mock 方法;
-
断言:使用社区的 testify 快速验证方法的返回值;