
1 序
任何包系统设计的目的都是为了简化大型程序的设计和维护工作,通过将一组相关的特性放进一个独立的单元以便于理解和更新,在每个单元更新的同时保持和程序中其它单元的相对独立性。这种模块化的特性允许每个包可以被其它的不同项目共享和重用,在项目范围内、甚至全球范围统一的分发和复用。
Golang中的包(Package)是类型、函数、常量和变量的集合,它将相关特性的函数和数据放在统一的文件或文件夹中进行管理,Golang中的包是一种组织代码的机制,它有助于将相关的代码组织在一起,使代码具有更好的可复用性、可维护性以及可读性。在Golang中,包是代码的基本单元,一个程序可以由多个包组成,每个包都有独立的命名空间。
每个包一般都定义了一个不同的名字空间用于它内部的每个标识符的访问。每个名字空间关联到一个特定的包,让我们给类型、函数等选择简短明了的名字,这样可以避免在我们使用它们的时候减少和其它部分名字的冲突。每个包还通过控制包内名字的可见性和是否导出来实现封装特性。通过限制包成员的可见性并隐藏包API的具体实现,将允许包的维护者在不影响外部包用户的前提下调整包的内部实现。通过限制包内变量的可见性,还可以强制用户通过某些特定函数来访问和更新内部变量,这样可以保证内部变量的一致性和并发时的互斥约束。
2 包的分类
2.1 按文件类型
按照文件类型来分,一般情况下源码文件分为三类,分别是命令源码文件、库源码文件和测试源码文件,而三类文件对应所在的两种包。
-
main包:命令源码文件所在包就是main包,即 package main是主函数(可运行的程序)所在的包,main包也是代码人口包; -
普通包:我们自定义包以及第三方库源码文件和测试源码文件所在包;
2.2 按文件范围
按照文件范围,Golang中的包可以分为三种:系统内置包、自定义包和第三方包。
-
系统内置包:Golang语言给我们提供的内置包,引入后可以直接使用,比如 fmt、strconv、strings、sort、errors、time、encoding/json、os、io等。 -
自定义包:开发者自己写的包。 -
第三方包:它也属于自定义包的一种,只不过是其他开发者开发的自定义包,需要下载安装到本地后才可以使用,比如前面章节介绍的 github.com/jmoiron/sqlx包。
3 包声明
在每个Golang源文件的开头都必须有包声明语句,它的大致格式为package <包路径>,包声明语句的主要目的是「确定当前包被其它包导入时默认的标识符(也称为包名)」,例如,math/rand包的每个源文件的开头都包含package rand包声明语句,所以当你导入这个包,你就可以用rand.Int、rand.Float64类似的方式访问包的成员。
3.1 包的声明规则
-
同一文件目录下直接包含的文件只能归属一个
package,同样一个package的文件不能在多个文件夹下,简单来讲就是,同一文件目录下你可以定义无数个Go文件,但是文件里面声明的包名必须是同一个,否则编译无法通过。 -
包名可以不和文件夹的名字一样,但是最好是保持一致。
-
包的声明语句package必须位于Go文件的第一行,否则编译错误。
-
Golang规定,
package main是主函数(可运行的程序)所在的包,其他的均为库文件的形式存在。
包名由小写字母、数字和下划线_组成,不能包含其他特殊符号。
packagemainimport("ratel.com/go-samples/db")funcmain(){db.NewDb()}//Output://Newdbfunction//Newinternalfunction//Newfafunction//Newfbfunction
从结果输出来看,db包下的Go文件都是可以导入internal包以及internal包下面的子包,而不能被db包同级的或者父级的包下面的Go文件导入,而export.go文件也可以导入internal包以及internal包下面的子包,这里不再演示。
❝
简单来说,
internal包以及internal包下面的子包能被internal包的父级包下面Go文件导入,而不能被父包之外的其他包下面的Go文件导入。❞
8 总结
总体来说,Golang的Package机制是一种简单而强大的代码组织方式,它有助于构建清晰、模块化、可维护且易于理解的代码结构,Package的导入机制使得我们可以在不同的项目中重用代码,提高了代码的可重用性,同时Package提供了一种简单而有效的封装机制,使得代码的实现细节对外部Package不可见,增强了代码的安全性和可维护性,下一章节我们将介绍函数。
本篇文章来源于微信公众号: 澹台烬聊技术
微信扫描下方的二维码阅读本文

Comments NOTHING