学习go语言时,有些疑惑目录与其下package的关系,在知乎上遇到一个解答,如下:
文章目录
下面是有关go语言调用其他目录下的库函数的示例。
关于go的package:引用文章https://zhuanlan.zhihu.com/p/91627930
go导包测试
通过import+目录 导入我们所需的库。需要注意的是,该目录下所有的go文件有且只有一个package类型。即如下图所示的目录结果中,src/main/study目录下,add.go与func_.go用该引用同一个package-name。
目录结构:
正常导入包
在与src/main的同级目录中有,src/tool,package-name为 tool。
我们在src/main目录下有个main.go将作为测试的程序,我们通过import导入其路径 ../tool
。
tool目录下存在多个相同的package
import的时候,会将其下所有的go文件都引入,而通常一个目录下只能有一个package。
现在,mylib.go 与 mylib2.go 都使用 tool 作为package-name。
运行正常,因为在 /src/tool 目录下只有一个 package。
tool目录下存在多个不同的package导致导入包失败
将mylib2.go中的package修改成,tool2。则在 src/tool 目录下就存在多个package-name。
则, 运行main.go 失败
导入src/main/study下的包
我们在试一下,导入当前目录的下级目录中的库。
例如在 ./study 目录下 Add函数,实现对两个参数的加和。
Func函数中,使用了一个匿名函数(闭包),在闭包中调用了Add函数对参数求和。而Func函数的返回值类型是一个对1,3求和的函数。
运行结果:
在下级目录,可以单独拥有package-name
每个目录下所有的go文件都应该使用同一个package-name,同时该目录的下级目录却可以拥有自己的package-name。
示例:每个go程序的的入口由 package-name 为main的程序中,main函数开始。如果想测试我们写好的库,可以在当前目录中创建一个子目录,用于临时执行测试函数功能。
例如,我们在 src/tool 目录下,新建一个main目录,在该目录中编写一个main.go用于测试 mylib.go 库的执行情况。
src/tool/main.go
执行main.go程序。
补充:
GOROOT和GOPATH
参考https://blog.csdn.net/qq_38151401/article/details/105729884
- GOPATH:GO语言使用的一个环境变量,使用绝对路径提供项目的工作目录。
- GOROOT:GOROOT就是Go的安装目录
GOPATH可以设置多个,其中,第一个将会是默认的包目录,使用 go get 下载的包都会在第一个path中的src目录下,使用 go install时,在哪个GOPATH中找到了这个包,就会在哪个GOPATH下的bin目录生成可执行文件
当引入module时,首先在GOROOT的src目录下查找,然后再GPOPATH的src目录下查找
通过 go env
命令查看
包引用格式
Go包的引入格式常见的有四种,下面以引用fmt包为例说明:
- 标准引用, import fmt, 使用fmt.Println()调用函数
- 设置别名引用, import format fmt ,可以format.Println()调用函数
- 省略方式的引用 import . fmt,相当于把包fmt的命名空间合并到当前程序的命名空间
- 仅执行包的初始化函数, import _ fmt