包是去程序的基本单位,所以每个去程序源代码的开始都是一个包声明:
包pkgName
这就是包声明,pkgName告诉编译器,当前文件属于哪个包,一个包可以对应多个* .go源文件,标记它们属于同一包的唯一依据就是这个包声明,也就是说:无论多少个源文件,只要它们开头包的包相同,那么它们就属于同一个包,在编译后就只会生成一个。文件,并且存放在$ GOPATH/pkg文件夹下。
示例:
(1)我们在$ GOPATH/目录下,创建如下结构的文件夹和文件:
分别写入如下的代码:
hello.go
//hello.go 包你好 导入( “fmt” ) func SayHello () { fmt.Println (“SayHello()——在Hello”) }
hello2.go
//hello2.go 包你好 导入( “fmt” ) func SayWorld () { fmt.Println (“SayWorld()——在世界”) }
main.go
//main.go 主要包 导入( “你好” ) 函数main () { hello.SayHello () hello.SayWorld () }
分析:
根据hello.go/hello2.go中包的声明可知,它们俩属于同一个包-你好,那么根据分析,编译后只会生成一个*。文件。
执行命令:
去安装你好
该命令的意思大概是:编译并安装你好包,这里安装的意思是将生成的*。文件放到工作目录GOPATH美元/pkg目录下去
运行后:
从结果看出,<强>果然只生成了一个包,并且名为hello.a 强>
那么我们提出第二个问题:<强>生成的*。文件名是否就是我们定义的包名+。后缀? 强>
为了验证这个问题,我们对源码做一些更改:
将hello.go/hello2.go中包的声明改为如下:
包hello_a
在编译安装包之前,先清除上一次生成的包:
去清洁我你好
再次编译安装该包:
去安装hello_a
按照”正常推理”,上面这句命令是没什么问题的,因为我们已经将包名改成hello_a了啊,但是实际的运行结果是这样的:
哦~不! !
那么,我们再试试用这条命令:
去安装你好
卧槽! !居然成功了! !是不是? ?
那么我们尝试生成一下可执行程序,看看能不能正常运行呢?
去构建主要
又报错了! ! !
看这报错提示,好像应该改一下main.go源码,那就改成如下吧:
//main.go 主要包 导入( “hello_a” ) 函数main () { hello_a.SayHello () hello_a.SayWorld () }
改成上面这样也合情合理哈?毕竟我们把包名定义成了hello_a了!
那就再来编译一次吧:
去构建主要
继续报错!
等等! !有新的发现,对比上两次的报错信息,可见第一次还能能找到hello_a包的,更改源码后居然还TM找不到hello_a包了? ?
好吧,那咱再改回的去,不过这回只改包的导入语句,改成: