你好,Go
在开始编写应用之前,我们先从最基本的程序开始。就像你造房子之前不知道什么是地基一样,编写程序也不知道如何开始。 因此,在本节中,我们要学习用最基本的语法让Go程序运行起来。
程序
这就像一个传统,在学习大部分语言之前,你先学会如何编写一个可以输出hello world
的程序。
准备好了吗?Let's Go!
package main
import "fmt"
func main() {
fmt.Printf("Hello, world or 你好,世界 or καλημ ́ρα κóσμ\n")
}
在任意目录下,编下一个文件(例如命名为 app.go),编辑文件填入上面的代码并保存。
打开命令行(Windows下使用cmd),进入到代码文件所在的目录,输入以下命令执行:
go run app.go
输出如下:
Hello, world or 你好,世界 or καλημ ́ρα κóσμ
当然,上面使用了go run
这个命令,这个命令适合学习时使用。
它的执行无须GOPATH, 即可以不用放在$GOPATH/src/这个目录下。
详解
首先我们要了解一个概念,Go程序是通过package
来组织的。
第1行
package <pkgName>
(在我们的例子中是package main
)这一行告诉我们当前文件属于哪个包,
而包名main
则告诉我们它是一个可独立运行的包,它在编译后会产生可执行文件。
除了main
包之外,其它的包最后都会生成*.a
文件(也就是包文件)并放置在$GOPATH/pkg/$GOOS_$GOARCH
中
(以Mac为例就是$GOPATH/pkg/darwin_amd64
)。
每一个可独立运行的Go程序,(源文件)必定包含一个
package main
, 在这个main
包中必定包含一个入口函数main
,而这个函数既没有参数,也没有返回值。
一个包含main函数的main包Go源文件,即package main
且有入口函数main
的,可以使用go run
这个命令执行。
前面学习时,可以只使用go run
这个命令,而不用管go build
, go install
等命令。
第3行
为了打印Hello, world...
,我们调用了一个函数Printf
,这个函数来自于fmt
包,
所以我们在第三行中导入了系统级别的fmt
包:import "fmt"
。
包的概念和Python中的package类似,它们都有一些特别的好处: 模块化(能够把你的程序分成多个模块)和可重用性(每个模块都能被其它应用程序反复使用)。 我们在这里只是先了解一下包的概念,后面我们将会编写自己的包。
第5行
我们通过关键字func
定义了一个main
函数,函数体被放在{}
(大括号)中,就像我们平时写C、C++或Java时一样。
大家可以看到main
函数是没有任何的参数的,我们接下来会学习如何编写带参数的、返回0个或多个值的函数。
第6行
我们调用了fmt
包里面定义的函数Printf
。
大家可以看到,这个函数是通过<pkgName>.<funcName>
的方式调用的,这一点和Python十分相似。
前面提到过,包名和包所在的文件夹名可以是不同的, 此处的
<pkgName>
即为通过package <pkgName>
声明的包名,而非文件夹名。
最后大家可以看到我们输出的内容里面包含了很多非ASCII码字符。 实际上,Go是天生支持UTF-8的,任何字符都可以直接输出,你甚至可以用UTF-8中的任何字符作为标识符。
结论
Go使用package
(和Python的模块类似)来组织代码。
main.main()
函数(这个函数主要位于主包)是每一个独立的可运行程序的入口点。
Go使用UTF-8字符串和标识符(因为UTF-8的发明者也就是Go的发明者之一),所以它天生就具有多语言的支持。