• 2012-04-10

    从Go看,语言设计(一)

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/dreamhead-logs/204670245.html

    Go语言发了正式版,终于像一个正经的东西了,不再需要每次从版本控制里面拿代码编译了。拿来把玩一番,看到了一些有趣的东西,记录一下。

    作为一门现代程序设计语言,Go语言从语言设计上反应出现代程序设计语言一些重要变化。

    函数成为第一类对象

    函数式编程已经无可阻挡地成为程序设计语言发展的重要趋势,只要是还在演进之中的程序设计语言,函数式编程都已经成为其重要的一部分,即便是Java这个笨重的大象,也会在Java 8中引入lambda。函数式编程的第一步,就是让函数成为第一类对象,也就是可以把函数作为参数和返回值传递。然后,才会有高阶函数,以及后面的一系列变化。

    下面是一个简单的Map实现:

    func Map(elements []int, f func(int)(int)) (results []int) {
    results = make([]int, len(elements))
    for i, element := range elements {
    results[i] = f(element)
    }
    return
    }

    调用起来也很简单:

    result := Map(elements, func(element int) int {
    return element + 1
    })

    稍微多说几句,在新一期的ThoughtWorks技术雷达上,函数式Java跃然纸上。我对这个问题的理解是,并不仅仅是要有函数式的语言构造,更应该是将函数式编程的一些理念引入到日常的开发中,比如引用透明性,无状态函数等等,这是个有趣的话题。

    简化代码编写

    程序员每天要写很多代码,设计一门程序设计语言,除了要考虑各种各样的语言特性之外,很重要的一点就是,就是让写代码更容易。类型推演和内置数据结构就是在这个方向上的努力,Go语言就提供了这两方面的支持。看看下面这段代码,典型的Java啰嗦代码:

    List lists = new ArrayList();
    lists.add(0);
    lists.add(1);
    lists.add(2);

    • 类型推演

    动态类型语言很令人羡慕的一点就是,他们的变量不用反反复复地写类型。它们也有让人鄙视的地方,没有类型的变量无法做静态检查,许多错误只能在运行阶段暴露。类型推演给予我们一个鱼与熊掌兼得的机会:既能从繁琐的类型声明中解脱出来,又能拜静态类型所赐,在编译期就可以做很多检查,减小犯错的几率。

    例子:

        car := new(Car)

    • 基本数据结构已不可或缺

    从语言设计的角度来讲,基本数据结构并不是语言的一部分。但从程序员的角度来说,基本数据结构的缺失会让代码显得无比啰嗦,这是对追求整洁代码之人的折磨。所以,有了人写了Guava这样的库,解救水深火热的Java人,下面是前面那段代码的Guava版本:

    List lists = newArrayList(0, 1, 2);

    Go语言内置了一些数据类型的支持,让代码编写稍微简化了一些,不过,相比于很多语言,它还不够简洁。

    有了类型推演和基本数据结构,前面那段啰嗦的代码在Go中就是这个样子了:

        elements := []int{1, 2, 3}

    分享到:

    历史上的今天:

    合并Runtime 2007-04-10
    引用地址: