16、hello.go, 2009年12约11日
不再需要分号。 这是在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版将我们带到了今天。
我们来深入挖掘一下,把这段代码做一个拆解。 19、Hello, World的16个tokens
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? |