设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 开源资讯 Google 查看内容

Go语言的演化历程

2014-10-31 10:52| 发布者: joejoe0332| 查看: 4220| 评论: 0|原作者: tonybai.com|来自: tonybai.com

摘要: 本文来自Google的Golang语言设计者之一Rob Pike大神在GopherCon2014大会上的开幕主题演讲资料“Hello, Gophers!”。Rob大神在这次分 享中用了两个生动的例子讲述了Golang的演化历程,总结了Golang到目前为止的成功因 ...


16、hello.go, 2009年12约11日

1
2
3
4
5
6
7
package main
 
import "fmt"
 
func main() {
    fmt.Printf("hello, world\n")
}

  不再需要分号。

  这是在2009年11月10日Golang开发发布后的一次重要改变。

  这也是当前版本的hello, world

  我们花了些时间到达这里(32年!)

  都是历史了!


17、不仅仅有C

  我们从”C”开始,但Go与C相比有着巨大的不同。

  其他一些语言影响和贯穿于Go的设计当中。

C: 语句和表达式语法

Pascal: 声明语法

Modula 2, Oberon 2:包

CSP, Occam, Newsqueak, Limbo, Alef: 并发

BCPL: 分号规则

Smalltalk: 方法(method)

Newsqueak: <-, :=

APL: iota

等等。也有一些是全新发明的,例如defer、常量。

还有一些来自其他语言的优点和缺点:

C++, C#, Java, JavaScript, LISP, Python, Scala, …


18、hello.go,Go 1版

  将我们带到了今天。

1
2
3
4
5
6
7
package main
 
import "fmt"
 
func main() {
    fmt.Println("Hello, Gophers (some of whom know 中文)!")
}

 

  我们来深入挖掘一下,把这段代码做一个拆解。


19、Hello, World的16个tokens

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package
main
import
"fmt"
func
main
(
)
{
fmt
.
Println
(
"Hello, Gophers (some of whom know 中文)!"
)
}


20、package

  早期设计讨论的主要话题:扩展性的关键

  package是什么?来自Modula-2等语言的idea

  为什么是package?

– 拥有编译构建所需的全部信息

– 没有循环依赖(import)

– 没有子包

– 包名与包路径分离

– 包级别可见性,而不是类型级别

– 在包内部,你拥有整个语言,在包外部,你只拥有包许可的东西。


21、main

  一个C语言遗留风范尽显之处

  最初是Main,原因记不得了。

  主要的包,main函数

  很特别,因为它是初始化树(initialization tree)的根(root)。


22、import

  一种加载包的机制

  通过编译器实现(有别于文本预处理器。译注:C语言的include是通过preprocessor实现的)

  努力使其高效且线性

  导入的一个包,而不是一个标识符(identifiers)集合(译注:C语言的include是将头文件里的标识符集合引入)

  至于export,它曾经是一个关键字。


23、”fmt”

  包路径(package path)只是一个字符串,并非标识符的列表。

  让语言避免定义它的含义 – 适应性。(Allows the language to avoid defining what it means—adaptability)

  从一开始就想要一个URL作为一个选项。(译注:类似import “github.com/go/tools/xxx)

  可以应付将来的发展。


24、func

  一个关键字,用于引入函数(类型、变量、常量),易于编译器解析。

  对于函数字面量(闭包)而言,易于解析非常重要。

  顺便说一下,最初这个关键字不是func,而是function。

  小插曲:

Mail thread from February 6, 2008

From: Ken Thompson <ken@google.com>

To: gri, r

larry and sergey came by tonight. we 
talked about go for more than an hour. 
they both said they liked it very much.

p.s. one of larrys comments was “why isnt function spelled func?”

From: Rob Pike <r@google.com>

To: ken, gri

fine with me. seems compatible with ‘var’.

anyway we can always say, “larry said to call it ‘func’”


25、main

  程序执行的起点。除非它不是。(译注:main不是起点,rob大神的意思是不是指下列情形,比如go test测试包,在google app engine上的go程序不需要main)

  将初始化与正常执行分离,早期计划之中的。

  初始化在哪里发生的?(译注:说的是package内的func init() {..}函数吧)

  回到包设计。(译注:重温golang的package设计思想)


26、()

看看,没有void

main没有返回值,由运行时来处理main的返回后的事情。

没有函数参数(命令行选项通过os包获取)

没有返回值

返回值以及语法


27、{

用的是大括号,而不是空格(译注:估计是与python的空格缩进对比)

同样也不是方括号。

为什么在括号后放置换行符(newline)?

28、fmt

所有导入的标识符均限定于其导入的包。(All imported identifiers are qualified by their import.)

每个标识符要么是包或函数的本地变量,要么被类型或导入包限定。

对代码可读性的重大影响。

为什么是fmt,而不是format?



酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部