在上一篇文章你好,Go语言中,我们对Go语言的历史和特点有了认识。接下来,我们就正式进入Go的学习了。
按照大部分编程语言的惯例,我们以经典的“Hello World”开始Go语言的学习之旅。
本教程中,我会使用最方便的方式Golang Playground来体验Go语言。在浏览器中打开https://play.golang.org,在页面直接编写Go代码,并运行。使用Golang Playground无需安装Go,无需配置Golang的开发环境(比如环境变量),无需安装文本编辑器或IDE。
大部分的Hello World教程都会从如何安装Go,配置环境变量等开始。但是Go语言的安装和开发环境配置其实是一个比较复杂的话题。我希望在大家刚接触Go语言时,能对go语言有一个快速,直观的认识。而不要陷入如何配置Go的开发环境。配置Go的开发环境涉及到Go语言的另外两个概念:GOPATH和Go module。而这又会牵扯到Go语言混乱、悠久的依赖管理发展史。后续会有专门的章节来进行介绍。
使用Go Playground
第一步:打开https://play.golang.org,在编辑框中输入Hello World程序:
package main
import "fmt"
func main() {
fmt.Println("Hello world")
}
如下图所示:
第二步:点击“Run”按钮,可以看到程序的输出结果“Hello,world”。
恭喜你,已经编写了第一个Go程序,并正确地输出了结果。
Go语言特性
虽然Hello World程序很简单,但是依然包含了Go语言的一些核心概念。接下来,我们就一行一行地解读Hello World程序。
第一行:package main
程序的第一行声明了名为main的package。Go语言的代码是通过package来组织的,package的概念和其他语言里的package,module概念类似,是一个逻辑的,包含了相同功能代码的集合。一个package会包含一个或多个.go
源代码文件。每一个源文件都是以package开头。比如我们的例子里是package main。这行声明语句表示该文件是属于哪一个package。
需要注意,package main是一个比较特殊的package。main package是Go程序的入口。准确说,Go程序的入口是名为main的package中的main方法(即例子中的main方法)。
第二行: import
package声明语句后紧跟着是import语句。import语句会引入其他package到当前文件中,这样就可以在当前文件使用其他package中的变量,常量,类型,方法等。Go的import和Java的import,C++的include类似。
Go标准库已经提供了100多个package,fmt
这个package包含接受输入,格式化输出的各种函数。Println
是其中的一个常用函数,可以格式化地输出一段文本。
第三行: func main
第三行声明了一个函数,函数名为main。在Go语言中使用func
关键字来声明一个函数。格式为:
func 函数名(参数名1 参数类型1, 参数名2 参数类型2, ... ) 返回类型1, 返回类型2, ...
比如下面的方法:
func sayHello(name string, age int) string
声明了一个sayHello方法。接收两个参数:string类型的name和int类型的age。并返回一个string类型的值。
前面也提到了,在main这个package里,main函数也是一个特殊的函数,这是整个程序的入口(其实C系语言差不多都是这样)。
第四行: fmt.Println
第四行是程序真正执行的逻辑,会输出“Hello world”。fmt是通过import引入的包,是go标准库提供的包。Println是fmt包中定义的一个方法,作用是将文本输出到标准输出。
Go语言特点
通过Hello world,我们可以发现Go语言的一些特点:
- 语句的结尾不需要分号。这和C系语言,Java等语言不同。
- Go语言不需要显示声明方法或变量的作用范围。即不用显式声明public或private。其实Go语言是通过变量或方法名的首字母是大写还是小写来确定作用范围的。大写字母开头的为public,小写字母开头的为private。
还有一些Go的特点,由于Hello world程序比较简单,没有体现出来。这里也顺带说一下:
- Go语言声明变量和方法参数时,名字在前,类型在后。比如
var name string
。这和C系语言,Java语言都不同。 - Go语言在代码格式上采取了很强硬的态度。go提供的
gofmt
工具会将你的代码格式化为标准格式(这个格式化工具没有任何可以调整代码格式的参数,Go语言就是这么任性),规定一种标准的代码格式可以规避掉无尽的无意义的圣战(撕逼)(也导致了Go语言的TIOBE排名较低,因为缺少撕逼的话题)。Go的这种哲学可以保证当一个大团队一起开发和维护一个项目时,团队间的协作更加地标准,高效。