IT技术博客大学习 共学习 共进步

从Go看,语言设计(一)

梦想风暴 2012-05-28 13:26:40 浏览 6,042 次

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}

建议继续学习

  1. Go Reflect 性能 (阅读 13,662)
  2. go-kit 入门(一) (阅读 4,601)
  3. 为什么我们要使用Go语言以及如何使用它的 (阅读 4,460)
  4. Go 语言初步 (阅读 4,403)
  5. 从Go看,语言设计(二) (阅读 3,820)
  6. Go 语言初学实践(1) (阅读 2,961)
  7. lua cothread (阅读 2,860)
  8. Go 语言简介(上)— 语法 (阅读 2,741)
  9. 谈谈Go语言的字符串设计 (阅读 2,580)
  10. Go 语言初学实践(2) (阅读 2,480)