从Go看,语言设计(一)
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}
建议继续学习:
- Go Reflect 性能 (阅读:9961)
- Go 语言初步 (阅读:3457)
- go-kit 入门(一) (阅读:3510)
- 为什么我们要使用Go语言以及如何使用它的 (阅读:3081)
- 从Go看,语言设计(二) (阅读:2879)
- Go 语言初学实践(1) (阅读:2208)
- lua cothread (阅读:2050)
- Go 语言简介(上)— 语法 (阅读:1809)
- Go 语言初学实践(2) (阅读:1684)
- Go 语言简介(下)— 特性 (阅读:1556)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:dreamhead 来源: 梦想风暴
- 标签: Go 语言设计
- 发布时间:2012-05-28 13:26:40
- [54] IOS安全–浅谈关于IOS加固的几种方法
- [52] android 开发入门
- [52] 如何拿下简短的域名
- [51] 图书馆的世界纪录
- [49] Oracle MTS模式下 进程地址与会话信
- [49] Go Reflect 性能
- [47] 【社会化设计】自我(self)部分――欢迎区
- [46] 读书笔记-壹百度:百度十年千倍的29条法则
- [35] 程序员技术练级攻略
- [29] 视觉调整-设计师 vs. 逻辑