Go语言入门

1. 简介





本文是关于Go编程语言的基础在线教程,主要面向有C/C++基础的读者。它并不是一个语言的完整指南,关于 Go的具体细节请参考 语言规范 一文。在读完这个入门在线教程后, 深入的华可以继续看 Effective Go ,这个文档 将涉及到Go语言的更多特性。此外,还有一个《Go语言三日在线教程》系列讲座。

下面将通过一些小程序来演示go语言的一些关键特性。所有的演示程序都是可以运行的,程序的代码在安装目录的 /doc/progs/ 子目录中。

文中的代码都会标出在源代码文件中对应的行号。同时为了清晰起见,我们忽略了源代码文件空白行的行号。

2. Hello,世界





让我们从经典的"Hello, World"程序开始:

  05    package main
  
  07    import fmt "fmt"  // Package implementing formatted I/O.
  
  
  09    func main() {
  10        fmt.Printf("Hello, world; or Καλημέρα κόσμε; or こんにちは 世界\n")
  11    }

每个Go源文件开头都有一个package声明语句,指明源文件所在的包。同时,我们也可以根据具体的需要 来选择导入(import语句)特定功能的包。在这个例子中,我们通过导入fmt包来使用我们熟悉的printf函数。 不过在Go语言中,Printf函数的是大写字母开头,并且以fmt包名作为前缀:fmt.Printf。

关键字func用于定义函数。在所有初始化完成后,程序从main包中的main函数开始执行。

常量字符串可以包含Unicode字符,采用UTF-8编码。实际上,所有的Go语言源文件都采用UTF-8编码。

代码注释的方式和C++类似:

          /* ... */
          // ...

稍后,我们还有很多的关于打印的话题。

3. 分号(Semicolons)





比较细心的读者可能发现前面的代码中基本没有出现分号;。其实在go语言中,只有在分隔 for循环的初始化语句时才经常用到;但是代码段末尾的分号一般都是省略的。

当然,你也可以像C或JAVA中那样使用分号。不过在大多数情况下,一个完整语句末尾的分号 都是有go编译器自动添加的——用户不需要输入每个分号。

关于分号的详细描述,可以查看Go语言说明文档。不过在实际写代码时,只需要记得一行末尾的分号 可以省略就可以了(对于一行写多个语句的,可以用分号隔开)。还有一个额外的好处是:在退出 大括号包围的子区域时,分号也是可以省略的。

在一些特殊情况下,甚至可以写出没有任何分号的代码。不过有一个重要的地方:对于"if"等 后面有大括弧的语句,需要将左大括弧放在"if"语句的同一行,如果不这样的话可能出现编译错误。 Go语言强制使用将开始大括弧放在同一行末尾的编码风格。

4. 编译





Go是一个编译型的语言。目前有两种编译器,其中"Gccgo"采用GCC作为编译后端。另外还有 根据处理器架构命名的编译器:针对64位x86结构为"6g",针对32位x86结构的为"8g"等等。 这些go专用的编译器编译很快,但是产生的目标代码效率比gccgo稍差一点。目前(2009年底), go专用的编译器的运行时系统比"gccgo"要相对健壮一点。

下面看看如何编译并运行程序。先是用针对64位x86结构处理器的“6g”:

  $ 6g helloworld.go  # 编译; 输出 helloworld.6
  $ 6l helloworld.6   # 链接; 输出 6.out
  $ 6.out
  Hello, world; or Καλημέρα κόσμε; or こんにちは 世界
  $

如果是用gccgo编译,方法和传统的gcc编译方法类似:

  $ gccgo helloworld.go
  $ a.out
  Hello, world; or Καλημέρα κόσμε; or こんにちは 世界
  $