Go是一个新的语言。虽然它从其他语言中借鉴了一些特性,但是Go语言的编程方式和其他是有本质却别的。如果只是简单的将C++或Java等代码翻译为Go代码是不可能得到最优的Go代码的。java程序员用java的思维方式编程,并不是Go的思维方式。如果采用go的思维方式,一个问题可能有完全不同的解决方法。因此,如果要真正的用好Go语言,理解它的语言特性和设计思想是 很重要的。另外,还要知道Go语言的变成风格,例如命名方式、格式化、程序结构等等,采用通用的方式也便于和其他的Go程序员交流。
接下来我们将逐步地学习Go语言,这一章先介绍Go语言基本的程序设计知识包括:语法、变量的声明、注释、控制流程等相关知识。
下面看一个最简单的Go应用程序,它对一个含有5个数字的数组进行求和:
package main import "fmt" //求数组的和 func sum(a []int) int { //返回 数组的和 var s int = 0 for i := 0; i < len(a); i++ { s += a[i] } return s } func main() { fmt.Print("Number:") n := [5]int{1, 2, 3, 4, 5} fmt.Println(n) s := sum(n[:]) fmt.Printf("Sum: %d/n", s) }
程序虽然很小,但是包含了go语言的更多特性。每个Go源文件开头都有一个"package"声明语句,指明源文件所在的包。同时,我们也可以根据具体的需要来选择导入(import语句)特定功能的包。在这个例子中,我们通过导入“fmt”包来使用我们熟悉的printf函数。 不过在Go语言中,Printf函数的是大写字母开头,并且以fmt包名作为前缀:fmt.Printf。
关键字“func”用于定义函数。关键字“var”用于声明变量。“len”函数是内置函数,用于求数组或字符串的长度。在所有初始化完成后,程序从main包中的main函数开始执行。
常量字符串可以包含Unicode字符,采用UTF-8编码。实际上,所有的Go语言源文件都采用UTF-8编码。
变量声明语法如下:
var s string = "";
这里有一个"var"关键字,后面跟着变量名字和变量的数据类型,再后面可以用“=”符号来进行赋初值。
简洁是Go的一个目标,变量的定义也有更简略的语法。Go可以根据初始值来判断变量的类型, 没有必要显式写出数据类型。也可以这样定义变量:
var s = "";
还有更短的写法:
s := "";
操作符":="将在Go中声明同时进行初始化一个变量时会经常使用。下面的代码是在"for"中声明并初始化变量:
for i := 0; i < len(a); i++ {
Go语言的"for"语句和C语言中有几个不同的地方:第一,for是Go中唯一的循环语句,Go中没有while或 do语句;第二,for的条件语句并不需要用小括号包起来,但是循环体却必须要花括弧,这个规则同样适用于 if和switch。后面我们会看到for的一些例子。
在循环体中,通过"+="操作符向字符串"s"添加要命令行参数和空白。在循环结束后,根据命令行是否有"-n"选项,判断末尾是否要添加换行符。最后输出结果。
值得注意的地方是"main.main"函数并没有返回值(函数被定义为没有返回值的类型)。如果"main.main" 运行到了末尾,就表示“成功”。如果想返回一个出错信息,可用系统调用强制退出:
os.Exit(1)
"os"包还包含了其它的许多启动相关的功能,例如"os.Args"是"flag"包的一部分(用来获取命令行输入)
代码注释的方式和C++类似:
/* ... */ 块注释
// ... 行注释
比较细心的读者可能发现前面的代码中行结尾处基本没有出现分号“;”。其实在Go语言中,只有在分隔 for循环的初始化语句时才经常用到;但是代码段末尾的分号一般都是省略的。
当然,你也可以像C或JAVA中那样使用分号。不过在大多数情况下,一个完整语句末尾的分号 都是有go编译器自动添加的——用户不需要输入每个分号。
Go是采用语法解析器自动在每行末增加分号,所有你在写代码的 时候可以把分号缩略。
这个规则是: 如果一个标记(token)的前一行是标识符(identifier)(就像"int"或 "float64"), 比如: 数字,一个字符串或一个标记.
break continue fallthrough return ++ -- ) }
那么语法解析器就会在标记的后面插入分号,也就是说"在标记的后面是个换行,这说明可能是语句的结束,就增加一个分号"。
在右括号之前可以省略分号,比如:
go func() { for { dst <- <-src } }()
关于分号的详细描述,可以查看Go语言说明文档。不过在实际写代码时,只需要记得一行末尾的分号 可以省略就可以了(对于一行写多个语句的,可以用分号隔开)。还有一个额外的好处是:在退出 大括号包围的子区域时,分号也是可以省略的。
在一些特殊情况下,甚至可以写出没有任何分号的代码。不过有一个重要的地方:对于"if"等 后面有大括弧的语句,需要将左大括弧放在"if"语句的同一行,如果不这样的话可能出现编译错误。 Go语言强制使用将开始大括弧放在同一行末尾的编码风格。
例如:
if i < f() { //正确! g() } if i < f() // 错误! { //错误! g() }