工作区
Go 代码必须放在工作区中。工作区其实就是一个对应于特定工程的目录,它应包含3个子目录:src 目录、pkg目录和bin 目录。
- src 目录:用于以代码包的形式组织并保存 Go源码文件。(比如:.go.chs等)
- pkg 目录:用于存放经由 go install 命令构建安装后的代码包(包含 Go 库源码文件)的“a”归档文件。
- bin 目录:与pkg目录类似,在通过go install命令完成安装后,保存由Go命令源码文件生成的可执行文件。
目录 src 用于包含所有的源代码,是 Go 命令行工具一个强制的规则,而 pkg 和 bi 则无需手动创建,如果必要Go命令行工具在构建过程中会自动创建这些目录。
需要特别注意的是,只有当环境变量 GOPATH 中只包含一个工作区的目录路径时,go install命令才会把命令源码安装到当前工作区的 bin 目录下。若环境变量 GOPATH 中包含多个工作区的目录路径,像这样执行 go install 命令就会失效,此时必须设置环境变量 GOBIN。
GOPATH
为了能够构建这个工程,需要先把所需工程的根目录加入到环境变量 GOPATH 中。否则,即使处于同一工作目录(工作区),代码之间也无法通过绝对代码包路径完成调用。
在实际开发环境中,工作目录往往有多个。这些工作目录的目录路径都需要添加至 GOPATH。当有多个目录时,请注意分隔符,多个目录的时候 Windows是分号,Linux系统是冒号,当有多个 GOPATH时,默认会将go get 的内容放在第一个目录下。
配置GOPATH
在系统中配置
- 通过在命令提示符中输入
go env
可以查看路径
- 在我的电脑,右击属性,高级系统设置
- 环境变量,新建一个
临时GOPATH
包
所有 Go 语言的程序都会组织成若干组文件,每组文件被称为一个包。这样每个包的代码都可以作为很小的复用单元,被其他项目引用。
一个包的源代码保存在一个或多个以.go
为文件后缀名的源文件中,通常一个包所在目录路径的后缀是包的导入路径。
工程管理
同一目录下
- 分文件编程(多个源文件),必须放在src目录
- 设置GOPATH环境变量
- 同一个目录,包名必须一样
- go env査看go相关的环境路径
- 同一个目录,调用别的文件的函数,直接调用即可,无需包名引用、
不同目录下
- 不同目录,包名不一样
- 调用不同包里面的函数,格式:包名.函数名()
- 要配置GOPATH
- 调用别的包的函数,这个包函数名字首字母如果是小写,无法让别人调用,要想让别人调用,必须首字母大写;
main函数
Go 里面有两个保留的函数:init函数(能够应用于所有的package)和main 函数(只能应用于 package main)。这两个函数在定义时不能有任何的参数和返回值。虽然一个 package里面可以写任意多个init函数,但这无论是对于可读性还是以后的可维护性来说,我们都强烈建议用户在一个 package中每个文件只写一个init函数。
Go 程序会自动调用 init0)和 main0,所以你不需要在任何地方调用这两个函数。每个 package中的 init 所数都是可选的,但 package main 就必须包含一个 main 系数。
每个包可以包含任意多个init函数,这些函数都会在程序执行开始的时候被调用。所有被编译器发现的init函数都会安排在 main 函数之前执行。init函数用在设置包、初始化变量或者其他要在程序运行前优先完成的引导工作。
程序的初始化和执行都起始于 main 包。如果 main 包还导入了其它的包,那么就会在编译时将它们依次导入。
有时一个包会被多个包同时导入,那么它只会被导入一次(例如很多包可能都会用到 fmt包,但它只会被导入一次,因为没有必要导入多次)。
当一个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行init函数(如果有的话),依次类推。等所有被导入的包都加载完毕了,就会开始对main 包中的包级常量和变量进行初始化,然后执行 main 包中的 init 函数(如果存在的话),最后执行 main 函数。下图详细地解释了整个执行过程:
导入包
- 传统方法
import "包"
导入包,导入后必须使用包名,然后.
操作。例如fmt.Println("xxx")
,否则编译失败。 - 常用的
import (
"fmt"
"os"
)
import . "fmt"
这样导入包,无需通过包名进行调用Println("xxx")
- 给包名起别名
import io "fmt"
,通过别名进行调用io.Println("xxx")
- 忽略此包
import _ "fmt"
通过_
表明忽略此包。有时,用户可能需要导入一个包,但是不需要引用这个包的标识符。实际上是调用了该包里面的init
函数。
自定义包
对于一个较大的应用程序,我们应该将它的功能性分隔成逻辑的单元,分别在不同的包里实现。我们创建的的自定义包最好放在GOPATH的src目录下(或者GOPATHsrc的某个子目录)。
在 Go 语言中,代码包中的源码文件名可以是任意的。但是,这些任意名称的源码文件都必须以包声明语句作为文件中的第一行,每个包都对应一个独立的名字空间:
package calc
包中成员以名称首字母大小写决定访问权限:
public:首字母大写,可被包外访问
private:首字母小写,仅包内成员可以访问
注意:同一个目录下不能定义不同的package。
工程管理总结
- src放源代码
- 如果有多个文件或者多个包,要先配置GOPATH环境变量,即配置GOPATH=src同级目录的绝对路径
- 如果想自动生成bin以及plg目录,需要使用go install目录,除了要配置GOPATH环境变量,还要配置GOBIN环境变量。
- 最终src放源代码,bin放可执行程序,pkg放平台相关的库。