# helloworld 叩开 Go 编程的大门
没有规矩不成方圆,在编程开始前,我们非常有必要了解下 Go 语言代码组织的基本规则和必要的要求。否则我们就是**外行**了。
为此,我们从编程入门第一个程序 helloworld 来看 Go 代码的组织结构。
## Go 代码的组织结构
Go 工具规定 Go 代码必须放到 **工作空间** 内,并且 Go 工具规定了工作空间的目录结构。
### 什么是工作空间
简单来说,工作空间就是磁盘上的一个文件夹(一个目录)。类似于 C++ 中的 workspace。即,工作空间就是一个项目(工程)的根目录。
### 工作空间的目录结构
- src:包含 Go 源文件
- bin:包含可执行文件(二进制文件)
其中,src 中的源文件被组织成**包**,src 中的每一个目录都对应一个包,也就是说 src 目录中都是一个个文件夹,每一个文件夹都是一个 Go 包(关于 Go 包请继续阅读)。
Go 工具用于将构建 Go 源文件,并将生成的二进制文件安装到 bin 目录。
### 关于 Go 包
工作空间中 src 目录下的所有文件夹都称为不同的 Go 包,源代码存放在对应的 Go 包中。
为了方便,也为了避免重复造轮子,Go 官方提供了一些*包*(如 fmt),他们是 Go 标准库的一部分。
既然官方提供了 Go 包,并命名了名字(如 fmt),那么我们在写自己的包的时候,是不是就不能使用 *fmt* 这个名字了?
当然,Go 工具没有那么蠢。Go 工具约定,对于非标准库中的 Go 包,必须给*包*选择一个**基本路径**。
Go 工具建议使用代码托管工具中的用户名(如 github.com/user)作为*基本路径*。因为代码托管工具中的用户名是唯一的,这样就解决了基本路径可能冲突的问题,不失为一个很好的方式,简单明了。
## 第一个程序 helloworld
### 创建工作空间并设置 GOPATH 环境变量
前面有说到,GOPATH 环境变量指定了你的工作空间位置,是开发中唯一需要配置的环境变量。
```
$ mkdir /home/ubuntu/work/go_work
$ export GOPATH=/home/ubuntu/work/go_work
```
Go 工具为了方便执行生成的二进制可执行文件,约定将工作空间下的 bin 目录添加到 PATH 环境变量中,如下:
```
$ export PATH=$PATH:$GOPATH/bin
```
至此,工作空间已经配置完成。
### 创建 hello 包
```
$ mkdir $GOPATH/src/github.com/user/hello
```
这里的 user 需要替换为你自己的 github 用户名。
### 添加 helloworld 源码
在 `$GOPATH/src/github.com/user/hello` 目录下创建 `hello.go` 文件,并在文件内添加下面的代码:
```
package main
import "fmt"
func main() {
fmt.Printf("Hello, world.\n")
}
```
**代码说明:**
- 第一行 `package main`
使用 `package` 关键字指定包的名字。Go 工具的第一个 Go 语句必须是 `package 包名`。但是,可执行文件必须使用 `package main`,相当于指定程序运行的入口。
更多详细的描述,请参考 [包名](https://golang.org/doc/code.html#PackageNames) 章节。
- 第二行 `import "fmt"`
使用 `import` 关键字导入一个外部包。fmt 包用于格式化输出。
- 第三、四、五行创建了一个 main 函数,花括号必须安装这个格式书写
第四行使用 fmt 包中的 Printf 函数输出字符串 “Hello, world.”。
### 构建 helloworld 源码
```
$ go install github.com/user/hello
```
成功运行上述命令的前提是正确配置了 GOPATH 环境变量。
上述命令 Go 工具默认到 GOPATH 工作空间中查找 src 下的 `github.com/user/hello` 包中的源码。**注意替换 user 为你自己的用户名**。
当然,你也可以在源码的根目录下执行,如下:
```
$ cd $GOPATH/src/github.com/user/hello
$ go install
```
执行完上述命令后,会生成一个可执行二进制文件,默认命名为 hello。执行完 `go install` 命令后,Go 工具会将 hello 二进制文件安装到工作空间下的 bin 目录中(即 $GOPATH/bin/hello)。
### 执行二进制程序
上述步骤成功后会在 `$GOPATH/bin` 目录下生成 hello 文件,这是一个可执行二进制文件。运行示例如下:
```
$ $GOPATH/bin/hello
Hello, world.
```
至此,我们已经成功编写、构建并执行了 hello 程序,成功输出了 hello world。
有疑问加站长微信联系(非本文作者)