爱上一个程序设计语言和爱上一个人差不多,主要是凭感觉。
在开发物联网边缘设备的过程中,使用C++ 编写了各种装载在docker 容器中的微服务App。其过程是一段痛苦的经历,不断地尝试各种C++库。感觉自己大多数时候都是在下载,cmake ,填坑。而不是在思考和编写自己的代码。就拿json 的编解码来说吧,不断地测试,最终选择了国内大公司腾讯难度的开源代码库rapidjson 库。结果也是一大堆的数据结构和定义。一个程序中几乎有一大堆是rapidJson 的东西。程序一不小心就会抛出内存出错。
2019年某一个被C++ 折磨的筋疲力尽的夜晚,出于消遣,在网络上搜索docker,容器,微服务的主题的文章。偶尔发现老外在讨论为什么要使用Go 来编写微服务程序。在这之前,我只是了解Go 是Google 开发的一种程序设计语言。毕竟现在的程序设计语言太多了,没有太在意。
也许是缘分吧,那个晚上我追进入更近距离地看了看Go 的来龙去么和优缺点。鬼使神差地安装了一个Go编译器。发觉很快装好了。依葫芦画瓢地运行了一个Hellowold ,很简单。进一步地写了一个 webserver 。发现比nodeJS 还要简单。一下子感觉对了,爱上了Go,真没想到,在自己几十年的程序设计生涯中,从delphi pascal 到C/C++ ,C#,javascript ,python。用过许多程序设计语言,居然到了快退休之年,还会爱上Go,并为之疯狂。真是爱情来了挡都挡不住。
好了,凭感觉爱上了Go,现在谈谈相处下来的印象吧.
-
简单,又不失优雅
Go 语言最大的特点就是简单。简直到了能省则省的地步。比如语句的最后没有逗号,if 语言的条件语句没有括号。可以动态定义一个变量,并根据赋给他的值的类型来确定类型。例如
d:=3
它不是简单的赋值语句,而是动态地定义了一个类型int 的变量d ,并初始化为3.
简单并不难,难的是又不失优雅。也就是写出来的东西并不是怪怪的。反而感觉很亲切。很直白,很确定。
-
该有的都有
Go 并不是简化版的C++,它添加了许多东西,让程序更加便捷.例如 函数的多值返回就很方便:
result,error:=fanc1()
同时返回了两个值,一个是结果,另一个是出错信息.这在程序设计中是非常常见的.但是在C++ 中就很麻烦.先要定义一个结构类型
struct {
int result,
error err,
} result;
result func1(){
result.result=3;
result.error=null;
return result;
}
虽然也可以这样写,但是巴拉巴拉一堆,在具体编写程序中,也许就搞个全局变量error 就算了.不会去故弄玄虚.
再比如string 操作.在go 中采取了JavaScript的方式.
s:="hello"+name;
而使用C++时,面对string 操作,我始终是一个菜鸟,不上网查查,始终写不对.
Go 语言将现代程序设计过程中需要的东西都结合到了核心标准库中去了.不再需要添加额外的库函数.
当你使用了Go 语言,就非常敬佩GO的设计者们,他们丰富的经验帮助他们将语言的性能拿捏的很准.该丰满的丰满,该苗条的地方苗条.
在比如线程,在C++ 中,有许多东西要定义
void recv ()
{
.....
}
Thread recv_thread;
recv_thread.start(recv);
而在go 中,一条语句,而且显得很坚定:
go recv()
-
去掉了似是而非的东西
C++ 功能强大,而且是一个面向对象的程序设计语言.面向对象程序设计方法是实现软件抽象的强有力的工具.在大学的程序设计课程中,教授们花了大量的课时来讲解,类,对象,构造函数,析构函数.不过学生们往往是云里雾里的感觉.经过多年的训练,终于学会了优雅地编写了各种类.感觉自己真成了半个计算机科学家.但是有时候还是自己将自己搞混的感觉.比如类中再定义类,他们的析构函数是什么时候调用的呢?虚拟函数,泛类...这些东西看看都懂,自己写就犯浑.
Go 语言的大佬们居然宣称Go 不是面向对象的程序设计语言.没有面向对象,日子照样过,而且很爽.学习曲线一下子平坦了许多.
使用GO 真有"懂的都有,不懂的全去掉了"的感觉.
-
为网络而生
一位老外写的Go 程序设计 书的副标题是"Creating Applications for the 21st Century",为21 世纪建立应用程序.评价非常高.21世纪是网络时代,几乎每个程序都需要联网.Go 语言的 net 包功能强大,几乎包括了TCP,UDP,Http server ,client 等大多数的协议.使用起来非常方便.编写一个web 服务器程序,要比nodeJS 还要简单.(顺便说一句,当年见到 NodeJS 的是时候也是非常激动的.有点相见恨晚的感觉)
package main
import (
"fmt"
"html"
"log"
"net/http"
)
func main() {
fs := http.FileServer(http.Dir("./www"))
http.Handle("/", fs)
http.ListenAndServe(":8080", nil)
}
专一,不善变
Go 语言的大部分程序库与一开始的样子差不多,各版本之间没有太大的变化,不像C++ 的库,升级一个库就天下大乱.而且Go 语言采用了静态库方式.编译出来的是一个单一的二进制执行程序.再不同OS 版本下运行的也没有多大的问题.
搜素引擎好像不会按照发布的时间顺序来搜索文章.有时候搜到的解决方法是过往的版本下的方法.结果对于新版本而言,就是一个坑.
GO 专一,不善变,始终爱你如初恋.
让复杂感觉简单
刚参加工作的时候,有位老工程师对我说,做一个复杂的设备并不难,将大量的功能放在一个机箱里就可以了.不过操作面板会很复杂,面板上的指示灯和开关会很多,就像飞机的驾驶舱那样.的确如此.系统复杂是本质,简单只是人们的感觉,让复杂的事物感觉简单是一门艺术,Go 做到了.