Go笔记之一:工程项目结构的注意事项

# Go笔记之一:工程项目结构的注意事项

---

## 对 Go 项目目录的理解 (Windows平台为例)
刚安装完的 Go 需要设定环境变量,最关键的环境变量有三个,GOROOT、GOPATH和GOBIN。GOROOT应该设定为 GO 在当前环境下的安装根目录,通常因为 windows 平台都是由安装工具安装完成,因此 windows 平台一般不需要设置。GOPATH 理解为是开发者的“工作区”,即表示进行开发编译 Go 程序的工作区,因此 GOPATH 允许设定多值。而 GOBIN 在 GOPATH 被设定为多值时发挥作用,即用于存放由 `go install` 命令产生的可执行文件。

## 用一个项目具体举例

项目取名 `calcproj`,包含一个可执行程序 `calc.exe`和一个独立库,项目结构如下
```
> calcproj
> |--calc.go
> |--lib
> |--less.go
```

`less.go` 实现了自定义类型:***Integer***,并提供了一个方法 ***Less( b Integer )***,该方法实现返回当前值是否小于参数值的结果
```go
package lib

type Integer int

func (a Integer) Less(b Integer) bool {
return a < b
}
```

`calc.go` 是入口 main,调用 `Less` 方法并打印出结果,为了方便,`main`函数中的赋值被固定
```go
package main

import(
"fmt"
"lib"
)

func main(){

var a lib.Integer = 3
fmt.Println(a, a.Less(2));
}
```

进入 `src` 目录运行 `go build calc.go`或`go build`,在`src`目录下获得可执行文件`calc.exe`,使用命令行工具运行,得到结果
```
C:\cinlapgo\calcproj\src>calc.exe
3 false
```

## 由书+实践+热心网友得到的经验总结
- [x] Go的项目可以以自定义名称开头,如`myhello`、`TxtReader`等等
- [x] 在项目目录下,按照 Go 的规则(至少)建立`src`目录
- [x] 以`src`为根目录,`main`包就放在`src`下,如果有其它包(如C#中的dll),就建子目录。子目录名字就是包名称,其下的 go 文档开头的也要符合该格式 `package 包名称(目录名)`
- [x] 如何正确的对待命令源码文件
> - [x] ***当代码包有且仅有一个命令源码文件时,在所在目录中执行`go build`命令,即可在该目录下生成一个与目录同名的可执行文件;若使用`go install`命令,则可在当前工作区`bin`目录下生成相应的可执行文件***
> - [x] ***命令源码文件不能与库源码文件在同一个代码包,否则无法正确执行`go build`和`go install`命令***
> - [x] ***同一个代码包中可以有多个命令源码文件,通过`go run`命令分别运行,但这会使`go build`和`go install`命令无法编译和安装该代码包。***

## 感谢

特别感谢Go语言技术交流群的 @【副总】西安-n1ce和@【总裁】重庆-im帥

# 参考资料
> * 参考书籍:《Go并发编程实战》
> * 参考书籍:《Go语言编程》