前言

Golang自2009年发布第一个版本,2012年发布1.0版本。在这10年的时间里,不断有开发者加入Golang的阵营中,不断共建Golang生态。其中比较有代表性的Golang编写软件作品是Docker和Kubernetes。从目前Golang的发展时间和社区活跃度来看,Golang无疑是一门成功的编程语言。

大道至简

有次微信公开课中,微信之父张小龙提到微信成功的秘诀就是简单,把所有功能做到最简单,UI最简单,用户使用最简单。这样使得竞品无法抄袭,因为微信是最简单的,对手加了一点东西都是冗余。那么什么使得Golang这么成功呢?

你可能会提到下面的原因:

  • 编译速度快
  • 执行速度快
  • 部署无依赖
  • 工具齐全
  • 官方库和第三方开源库丰富

但是这些不是语言特性,全都非常重要但是不是真正的答案。比较少谈起的是:接口或者并发这样真正的语言特性。真正的原因是简单。Golang是简单的,至少相比于当前的编程语言来说是简单的。简单有很多面,简单同时也是复杂的。语言使用上的简单对应的肯定是底层实现原理的复杂,和设计人员的精美设计的结果。

其他编程语言

Java,JavaScript,C#,C++,PHP,Python 这些编程语言积极的互相借鉴语言特性,例如这些语言都会有class(类)。它们正在汇总为一个简单的大型语言

编程语言需要不同的维度考虑:

逻辑编程(logic programming)

过程编程(procedural programming)

函数编程(functional programming)

面向对象编程(object-oriened programming)

并发编程(concurrent programming)

如果所有的编程语言都汇总在一起,那么我们思考的编程模式就会是一样的。但是有不同的思考方式是好的,需要不同的编程语言解决不同的问题。我们要的不是仅仅只有一个工具,而是一堆工具,不同的工具聚焦解决不同的问题。前面提到的语言,如Java8,C++14正在讨论新的特性,这些语言通过加入特性在不断的竞争。当某个语言出现了某个特性时,另外的语言一定会跟随,例如C++11/14加入的类型推导,不由得让人想起了脚本语言Python。这些语言在发展的过程会变得越来越复杂,同时也会变得越来越相似。它们会膨胀得没有区分度。

Golang

Golang没有尝试像其他编程语言,不在特性上竞争。Golang 1.0版本发布时,这门语言的特性就已经固定了。很多Golang的新手会要求Golang具有一些他们知道的其他编程语言的特性。但是这些特性不属于Golang,这门编程语言的特性已经固定了。加入新特性不会使Golang变得更好,只会使它变得更大,更臃肿。

可读性

如果一门编程语言有太多特性,你会浪费时间在挑选用哪个的问题上。然后实现,精简,可能会回想和重做。

实际工作中,经常会发生的一幕是,有人会问,“为什么这些代码要这样写,这段代码是怎么工作的”,这个人可能是其他人,更有可能是你自己。这些代码是很难简单的能理解到,因为它用了一个更加复杂的编程语言,由于复杂编程语言的诸多特性,可能会导致很多分支的结果,所以我们需要分析这段代码的各种可能性,一不小心就会掉到坑里面。所以对于程序员来说,更倾向于只有一种实现方法,或者至少应该是尽量少的实现方法,更简单的实现方法。更多的特性会增加编程语言的复杂度,我们想要简单的编程语言。更多的特性会让可读性受损,我们想要可读性。可读性是最重要的。因为可读性意味着可靠性,如果你能够读懂代码和它意味着什么,就会很容易明白它的工作原理。如果它出现问题也会更容易修复。

设计理念

简单的交互方式是简单的特性。简单是Golang的目标。

Golang实际上实现原理非常复杂,但是它看起来很简单,使用很简单。语法非常简单和准确,没有歧义,没有惊喜。这需要Golang的创始人/团队经过大量的设计、实现和优化。所以简单是掩盖复杂的一门艺术。

下面会介绍Golang的几个简单特性:Gc机制(垃圾回收),goroutine,interface(接口),package(包)。每个简单的特性后面都是复杂的实现。

垃圾回收

垃圾回收可能是最好的用简单掩盖复杂的特性。实现起来非常难,但是很值得。因为有gc机制我们Golang代码编写得更简单。写代码的时候不需要关心“拥有者”。

并发

Golang原生就支持了并发,而不是依赖第三方库。Golang并发包括下面三个元素:goroutines(执行体),channels(通信),select(协调)。

这里我们只需要暂时先关注goroutine,通过go function(args)启动一个独立运行的goroutine。三个字符’g’ ‘o’ ‘ ’就能启动一个goroutine。很难做到比这更简单的了。和gc机制一样,将编程人员需要关心的东西最小化。栈的大小,返回值和完成状态,线程 ID等都不用关心。虽然goroutine的实现很复杂,依赖于gc机制和栈管理,但是编程人员不用关心这些,只需要go就能启动一个goroutine。

接口

接口仅仅是方法的集合,没有数据。很简单的想法。

type Reader interface {

       Read([]byte)(int, error)

}

var r Reader = os.Stdin //静态检查

var x interface{} = os.Stdin //静态检查

r = x.(Reader) //动态检查,一定要是精准断言,否则会panic

在静态类型语言中加入动态类型转换,这些需要小心精准的设计。接口的赋值在运行时完成。最好是用“comma, ok”的语法,否则失败会panic。接口是Golang最有区分度和最强大的特性。深度影响了包的设计。另外包允许组合,例如可以将io.Reader和io.Writer组合为io.ReadWriter。感觉很简单,实则底层原理很复杂。

一个结构化程序和库的设计。

package big

…

import “math/big”

包的设计花费了Golang团队大量时间去设计。允许组合,可扩展,共享,数据隐藏(大小写),还有隔离 …。包的设计涉及到程序的设计,语法,命令,编译,链接,测试等等。但是对于Golang编程人员来说只需要使用package定义包,用import引用包即可。这也是用简单掩盖复杂的一个例子。

上述的示例都是为了说明Golang使用是非常简单,实现非常复杂。作为Golang的使用者,我们只需要清楚它的使用即可,而无需关心Golang的复杂实现,这也是Golang团队的目标。

下面是一个简单的Golang程序:

package main

import (
"fmt"
"log"
"net/http"
) func 你好_Gophers(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "你好 Gophers!\n")
} func main() {
http.HandleFunc("/", 你好_Gophers)
err := http.ListenAndServe("localhost:12345", nil)
if err != nil {
log.Fatal("ListenAndServer:", err)
}
}

掩盖了下面的复杂过程:

Unicode和UTF8处理

包的引用和使用

Fprintf直接对接网络连接

函数作为参数传递(HandleFunc)

真正的并发 —server并没有阻塞

总结

Golang是使用简单,底层实现原理复杂的一门编程语言。

参考

https://www.youtube.com/watch?v=cQ7STILAS0M

Golang 受欢迎的原因:大道至简的更多相关文章

  1. 《大道至简》第三章读后感+ppt课后作业

                   大道至简读后感 ——第三章团队 古人云“三人为众”,众则是指团体或团队.对于一个团队而言,重要的是凝聚力,大家能在一起把拳头握紧那么产生的力量就不紧紧是能以1+1=2 来 ...

  2. 阅读《大道至简第一章》读后感 (java 伪代码)

         通读大道至简第一章愚公移山,可以将其看做一个完整的工程,首先是创建工程的原因,需求:“惩山北之塞,出入之迂”,而后是团队之间的商议:“聚室而谋曰”,然后确定工程的目标:“毕力平险,指通豫南, ...

  3. [C#学习教程-委托]001.大道至简之委托(代理),匿名函数,Lambda表达式

    引言:此文翻译自CodeProject上的同名文章<C# Delegates,Anonymous Methods, and Lambda Expressions>,在此一起Mark一下,此 ...

  4. Java学习day35(《大道至简》读后感)

    对于大一之前的我来说,并不明白计算机这个专业要做的是什么,在我的眼中敲敲键盘打打字就是这个专业的全部:对于现在的我而言,这样的想法显然是十分幼稚的. 当初高考完填报志愿时选择了这门专业,也并不是因为自 ...

  5. 《大道至简》第一章读后感--JAVA语言伪代码形式

    import.java.大道至简.*; //一·愚公移山 import.java.愚公移山.*; public class YuGongYiShan { //原始需求:惩山北之塞,出入之迂 //项目沟 ...

  6. 《大道至简》第一章——编程的精义_读后感(Java伪代码形式)

    <大道至简>第一章——编程的精义_读后感(Java伪代码形式)1.愚公移山//愚公为团体的项目组织者.团体经理.编程人员.技术分析师等//子孙荷担者三人为三名技术人员//遗男为外协//目标 ...

  7. 《大道至简》第一章读后感(java语言伪代码)

    中秋放假之际读了建民老师介绍的<大道至简>的第一章,其中以愚公移山的故事形象的介绍向介绍编程的精义.愚公的出现要远远早于计算机发展的历史,甚至早于一些西方国家的文明史.但是,这个故事许是我 ...

  8. 《大道至简》之第一章:编程的精义读后感(JAVA伪代码)

    ——大道至简之编程的精义读后感(JAVA伪代码) import.java.大道至简.*; import.java.愚公移山.*; public class YuGongYiShan{ 愚公 = {项目 ...

  9. 大道至简---软件工程实践者的思想------------java伪代码形式读后感第一章

    import.java.大道至简.*; 1.编程的精义----愚公移山 /* 原始需求的产生:惩山北之塞,出入之迂 项目沟通的基本方式:聚室而谋曰 项目的目标:毕力平险,指通豫南,达于汉阴 技术方案: ...

随机推荐

  1. 新浪API登录实例

    步骤一:添加网站 进入新浪微博开放平台,http://open.weibo.com/apps 进入“管理中心“,点击”创建应用”,选择“网页应用”,填写相应的信息后提交. 步骤二:Oauth2.0授权 ...

  2. 分配粒度和内存页面大小(x86处理器平台的分配粒度是64K,内存页是4K,所以section都是0x1000对齐,硬盘扇区大小是512字节,所以PE文件默认文件对齐是0x200)

    分配粒度和内存页面大小 x86处理器平台的分配粒度是64K,32位CPU的内存页面大小是4K,64位是8K,保留内存地址空间总是要和分配粒度对齐.一个分配粒度里包含16个内存页面. 这是个概念,具体不 ...

  3. 零元学Expression Blend 4 - Chapter 6 如何置入Photoshop档案以及入门动画设计

    原文:零元学Expression Blend 4 - Chapter 6 如何置入Photoshop档案以及入门动画设计 本章将教大家如何把Photoshop档案置入Expression Blend ...

  4. C# ToolStrip在父窗体失去焦点时,点击里面的按钮无效

    C#里面ToolStrip控件,在父窗体失去焦点的情况下,第一次点击ToolStrip上面的按钮,只是让父窗体获得焦点,并不会引发按钮的Click事件.要执行按钮操作必须再点击一次.相当于说,在父窗体 ...

  5. virtualbox 安装 extension pack 方法以及出现 "The installer failed with exit code 1: VBoxExtPackHelperApp.exe: error: Failed to rename the temporary directory to the final one"的解决办法

    virtualbox 的版本:5.1.26    下载地址:https://www.virtualbox.org/wiki/Downloads extension pack 的版本:5.1.26   ...

  6. 为新项目添彩的 10+ 超有用 JavaScript 库

    快速使用Romanysoft LAB的技术实现 HTML 开发Mac OS App,并销售到苹果应用商店中.   <HTML开发Mac OS App 视频教程> 土豆网同步更新:http: ...

  7. 深入解析Windows窗口创建和消息分发(三个核心问题:怎么将不同的窗口过程勾到一起,将不同的hwnd消息分发给对应的CWnd类去处理,CWnd如何简单有效的去处理消息,由浅入深,非常清楚) good

    笔记:争取不用看下面的内容,只看自己的笔记,就能记住这个流程,就算明白了: _tWinMain-->AfxWinMain,它调用四个函数: -->AfxWinInit用于做一些框架的初始化 ...

  8. 从零开始的Wordpress个人博客搭建

    0x00前言 在博客园写了有一年的博客了,也想换换新口味,wordpress的众多的主题和个性化设置非常符合我的喜好,所以捣鼓了一天也算是把它搭好了. 直接在服务器上搭建wordpress还需要配置m ...

  9. epoll模型的探索与实践

    我们知道nginx的效率非常高,能处理上万级的并发,其之所以高效离不开epoll的支持, epoll是什么呢?,epoll是IO模型中的一种,属于多路复用IO模型; 到这里你应该想到了,select, ...

  10. python 参考知识点

    本笔记仅作为有编程基础的童鞋在学习python时的参考资料,不适合零基础小白,并假设在你的电脑上已经正确安装了python环境,windows下需要配置环境变量,可以在终端窗口中执行以下命令 set ...