说说Go语言的简

越是接触的编程语言多了,越是做的项目多了,就越是觉得Go语言的简单是多么一件不简单的事——在一个惯有思维的世界中,舍弃了这么旧世界的东西,是非常不简单的。

是的,我的观点就是,加法大家都会做,但对一件事情做减法、提炼精华,却是相当的不容易的。

简在哪里?

没有类

Go语言中没有类(class)。
接触过Lua或JavaScript的都知道,Lua和JavaScript没有class关键字,要实现对象功能,是通过“原型”来实现的(prototype)。

type BaseObject struct { // 基类
    field1 int
}

type TestObject struct {  // 继承自BaseObject
    BaseObject
    field2 int
}

没有try, catch

Go语言没有try和catch关键字?!
我想用惯了try和catch捕获错误的工程师们肯定会非常惊讶。但我也是那种比较痛恨try-catch的人,它们的出现经常让错误难以侦察。

// C#
try
{
    Do1()
    Do2()
    Do3()
}
catch (Exception e)
{
    Log(e.Message)
}

不开玩笑的说,类似的try-catch大包围非常的常见,到出错了的时候,究竟是Do1还是Do2还是Do3的问题啊? 不知道,好吧只能断点了。

以往在C#开发中,我更喜欢以类似的方式

// C#
IsNotNull(Do1, "Error! Do1 is null")
IsTrue(Do2, "Error! Do2 is false")

为错误做文字描述,看起来啰嗦,但当成千上万的代码堆积如山时,这样做的好处却是非常明显的,瞄一眼就能定位到错误的地方。

Go语言中没有try-catch,错误的捕捉其实就是类似这样的方式:

// Go lang
do1Result, err := Do1()
if err != nil {
    fmt.Errorf("Do 1 is wrong!")
}

是的,适当的字符串描述是啰嗦,但却相当于为做买好了保险。

没有构建工具

要建个C语言工程是吧?最起码装个Turbo C、Visual Studio C++吧; 要建个Java工程吧?JVM、IDE一套东西要弄吧…

编程的世界里,构建工具非常的多:make、autoconf、cmake、Ant、Maven、Gradle等等等;

在Go语言中,“go build”命令,就是你的构建工具;“go test”命令就是你的单元测试工具;开发、编译、测试,它全部都帮你做好了。

强制代码格式化

我是一个经常会为单词、空格、命名、排版斟酌半天的人,Go语言的强制格式化十分对我的胃口——所有的空格、字符对齐、花括号({})的位置都是在保存的一瞬间自动强制排版的。

统一排版的代码,会给大家一种非常舒服的感觉。美中不足的是没有强制添加注释功能,要不然就又少一个分歧点了……
比如我手贱,输入:

const(
    ConstA
        ConstB
)

经过go fmt进行格式化,它就会变成

const (
    ConstA
    ConstB
)

嗯,强迫症患者的最佳疗法。

另外一提:

// Go lang
func Func()
{ // Compie error!

}

在C#中,花括号{是习惯另起一行的,而在Go于中,却会导致编译错误。

简得不彻底的地方

Go语言的简,是相对于有编程基础的人来说的。这里提及一下我认为他不够简的地方,更多是从小白、零基础的人角度去考虑的,会让他们入门造成困扰的。

指针

Go语言中让我觉得最不够简化的地方,非指针莫属了。

并不是说我讨厌指针,这里针对的是没有基础的小白的,即毫无编程基础的普通人。它增加了Go语言入门的一难度,毕竟像其它的一些脚本语言如Python,是真的可以像写英文诗一般快速入门。

标准库的接口

毕竟定位于系统级编程的Go语言,标准库的接口封装更为抽象一些也是无可厚非的。这使它更健壮、更灵活,但降低了一定的易用成都。

标准库的接口封装抽象是怎么理解? 举个超简单的例子,像我们要打印一段文字:

// shell 
echo 'hello world'

使用shell来实现,非常简单。

# Python
print 'hello world'

而在脚本语言python中,也是非常简单。

// Go lang
import "fmt"
func main() {
    fmt.Println("hello world")
}

而在Go语言中,就要稍微复杂,要导入包了。更不用说像一些文件读取、写入方面的接口了。

当然了,系统级编程语言来说,这样良好的模块性设计其实是一大优点,只不过我们这里关注它的“简”,吹毛求疵。

Go语言更多是我业余的一些研究,而在实际工作中,却并未应用开来。毕竟对领导们来说,旧有的熟悉的东西,才是稳定的保证。

但是它更多让我学习到的,是它的思路——足够的简单,狠心的舍弃不必要的。

    原文作者:陈小霖GO
    原文地址: https://www.jianshu.com/p/5596c0fcce66
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞