在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Go是一门推崇软件工程理念的编程语言,它为开发周期的每个环节都提供了完备的工具和支持。 Go语言高度强调代码和项目的规范和统一,这几种体现在工程结构或者说代码体制的细节之处。 1.工作区一般情况下,Go源码文件必须放在工作区中。但是对于命令源码文件来说,这不是必须的。 (1)src目录用于以代码包的形式组织并保存Go源码文件,这里的代码包与src下的子目录一一对应。 (2)pkg目录用于存放通过go install命令安装后的代码包的归档文件。 (3)bin目录与pkg目录类似,在通过go install命令完成安装后,保存由Go命令源码文件生成的可执行文件。
2.源码文件(1)命令源码文件如果一个源码文件被声明属于main代码包,且该文件代码中包含无参数声明和结果声明的main函数,则它就是命令源码文件。 若使用go install命令,则可在当前工作区的bin目录下生成相应的可执行文件。 需要注意的是,只有当前环境变量GOPATH中只包含一个工作区的目录路径时,
(2)库源码文件通常,库源码文件声明的包名会与它直接所属的代码包一致,且库源码文件中不包含无参数声明和无结果声明的main函数。 通过执行go install命令,成功安装了该包并生成了若干归档文件。 run install之后:
(3)测试源码文件测试源码文件是一种特殊的库文件,可以通过执行go test命令运行当前代码包下的所有测试源码文件。 当在一个代码包中之心go test命令时,该代码包中的所有测试源码文件会被找到并运行。 3.代码包在Go中,代码包是代码编译和安装的基本单元,也是非常直观的代码组织形式。 (1)包声明在Go语言中,代码包中的源码文件可以任意命令。 分别打印第一行: 其中,package是Go中用于包声明语句的关键字。 所以包名是base。 (2)包导入 import "gopcp.v2/helper/log/base" import "gopcp.v2/helper/log/logrus" 全路径是:/root/example.v2/src/gopcp.v2/helper/log,但是所有的源代码都在src下面,所以这里使用相对路径。 import ( "gopcp.v2/helper/log/base" "gopcp.v2/helper/log/logrus" ) 同一个源码文件中导入多个代码包的最后一个元素不能重复,否则一旦使用其中的程序实体,就会引起编译错误。 import ( "gopcp.v2/helper/log/logrus" mylogrus "gopcp.v2/helper/log/logrus" ) 如果我们想不加前缀而直接使用某个依赖包中的程序实体,就可以用"."来代替别名。 import ( . "gopcp.v2/helper/log/logrus" ) 所以我们就可以这样引用: var logger = NewLogger("gopcp") //NewLogger是logrus中的一个函数。 我们可以看到,因为"."的缘故,可以直接引用包中的函数,而不需要指定路径。 import ( _ "gopcp.v2/helper/log/logrus" ) 这种情况下,我们只是触发了这个代码包的初始化操作,符号"_"就像一个垃圾桶。 (3)包初始化 func init() { fmt.PrintLn("Initialize...") } Go会在程序真正执行前对整个程序的依赖进行分析,并初始化相关的代码包。 //如果一个源码文件被声明属于main代码包,且该文件代码包含无参数声明和结果声明的main函数,则它就是命令源码文件。 package main //命令源码文件必须在这里声明自己属于main包 import ( //导入标准库代码包fmt和runtime "fmt" "runtime" ) func init() { //代码初始化函数 fmt.Printf("Map: %v\n", m) //这里可以直接获取到变量m,可以看出变量的初始化在代码包初始化之前完成 //通过runtime获取当前操作系统和计算架构 //通过fmt的Sprintf进行格式化然后赋值给info info = fmt.Sprintf("OS:%s,Arch:%s", runtime.GOOS, runtime.GOARCH) } //非局部变量,map类型,且已初始化,因为已经赋值 var m = map[int]string{1: "A", 2: "B", 3: "C"} //非局部变量,string类型,未初始化,因为还未赋值 var info string func main() { //命令源码文件必须有入口函数,也可以叫做主函数 fmt.Println(info) //代码包的初始化会在main函数执行前执行完毕 } //同一个代码包中可以存在多个代码初始化函数,甚至代码包内的每一个源码文件都可以定义多个代码初始化函数。 //Go不会保证同一个代码包中多个代码包初始化函数的执行顺序。 //被导入的代码吧的初始化函数总是会先执行,例如上面fmt和runtime中如果有init函数,那么就会先执行。
|
请发表评论