Golang / 未分类 · 2023年3月7日 0

关于Golang的那些事(九) — 包和go工具【】

       和Node.js的npm包类似,Go也有自带的100多个包以及开源社区贡献的包,这样很多功能就可以复用别人成熟的代码,提高自己写代码的效率了,这次讲解一下Go的包和Go工具。

        任何包管理系统的目的都是通过关联的特性进行分类,组织成便于理解和修改的单元,使其与程序的其他包保持独立,从而有助于设计和维护大型的程序。模块化允许包在不同的项目中共享、复用,在组织中发布,或者在全世界范围内使用。当我们修改一个文件的时候,我们必须重新编译文件所在的包和所有潜在依赖它的包。众所周知,Go程序的编译比其他语言快,这主要是因为三个因素:1. 所有的导入都必须在每一个源文件的开头进行显示引入,这样编译器在编译的时候就不需要读取和处理整个文件了。2. 包的依赖性形成有向无环图,因为没有环,所以包可以独立甚至并行编译。3.Go包编译输出的目标文件不仅记录它自己导出的信息,还记录了它所依赖的包导出的信息。

        在每个Go源文件的开头都需要进行包声明。主要目的是当该包被其他包引入的时候作为其默认的标识符(称为包名),例如math/rand包中每一个文件的开头都是package rand,这样当你导入这个包的时候,可以访问它的成员,比如rand.Int、rand.Float64等。通常包名是导入路径的最后一段,于是及时导入路径不同的两个包,二者也可以拥有同样的名字。例如两个包的导入路径分别是math/rand和crypto/rand,而包的名字都是rand。

         一个Go源文件可以在package声明的后面和第一个非导入声明语句前面紧接着包含零个或者多个import声明,每个导入可以单独指定一条导入路径,也可以通过括号括起来,以表示导入多个包。导入的包可以通过空行进行分组,这类的分组通常表示不同领域和不同方面的包,导入顺序不影响使用顺序,但通常来说,大家都习惯于按字母来排序,这样寻找起来也更加方便,当然了每次导入都要找到合适的位置进行字典排序导入很麻烦,Go的gofmt和goimports工具都会帮助我们快速自动进行分组并排序,这样就令到我们的导入更加的便捷。

       这里就必须提到一个内部包的概念,如果没有任何的标志符去设置权限,那么导出的标识符就可以在世界的任何地方访问。有时候有一个中间地带很重要,这种定义的方式可以令一个小的可信任的包集体访问,但不是所有人可以访问。为了解决这些需求,go build工具会特殊对待导入路径中包含路径片段internal的情况,这些包就叫做内部包。内部包只能被另一个包导入,这个包位于internal目录的父目录为根目录的树中。例如,给定下面的包,net 、http、internal、chunked可以从net、http、httputil或者net、http导入,但是不能从net、url进行导入。然而net、url可以导入net、http、httputil。

net/http

net/http/internal/chunked

net/http/httputil

net/url

打赏 赞(0) 分享'
分享到...
微信
支付宝
微信二维码图片

微信扫描二维码打赏

支付宝二维码图片

支付宝扫描二维码打赏