说说Go语言的简

作者: 陈凯利 | 来源:发表于2016-05-09 20:17 被阅读618次

    越是接触的编程语言多了,越是做的项目多了,就越是觉得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.haomeiwen.com/subject/pbjerttx.html