原因:将程序所有的代码都放入一个源码文件是不合理的,需要分文件管理相关代码,但是随着程序文件的增多,也必须有一种将文件加以组织管理的方式/形式,于是Go引入了“包”的概念。包是程序功能/属性“分散管理” 、“归一使用”的一种逻辑意义上的组织形式。
本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。
我们用go语言开发的程序文件称之为源码文件(源码文件必须以.go结尾)。很明显将程序所有的代码都放入一个源码文件是不合理的,需要分文件管理相关代码,但是随着程序文件的增多,也必须有一种将文件加以组织管理的方式/形式,于是Go引入了”包“的概念。
包是go语言提供的一种虚拟的概念,包声明一致的多个源码文件在逻辑上被组织到一起、同属于一个包。
Go语言的包借助了目录树的组织形式,一般包的名称就是其源文件所在目录的名称,虽然Go语言没有强制要求包名必须和其所在的目录名同名,但还是建议包名和所在目录同名,这样结构更清晰。
包可以定义在很深的目录中,包名的定义是不包括目录路径的,但是包在引用时一般使用全路径引用。比如在GOPATH/src/a/b/ 下定义一个包 c。在包 c 的源码中只需声明为package c,而不是声明为package a/b/c,但是在导入 c 包时,需要带上路径,例如import "a/b/c"。
包的习惯用法:
包名一般是小写的,使用一个简短且有意义的名称。
包名一般要和所在的目录同名,也可以不同,包名中不能包含- 等特殊符号。
包一般使用域名作为目录名称,这样能保证包名的唯一性,比如 GitHub 项目的包一般会放到GOPATH/src/github.com/userName/projectName 目录下。
包名为 main 的包为应用程序的入口包,编译不包含 main 包的源码文件时不会得到可执行文件。
一个文件夹下的所有源码文件只能属于同一个包,同样属于同一个包的源码文件不能放在多个文件夹下。
(1)包的声明、包的导入路径、注意的问题
//一:包的声明 // 1、每个源码文件都必须在文件头处声明自己归属的包。 package 包名 // 包名一般总是用小写字母 // 2、包名任意,包名一致的属于同一个包 // 3、包是编译和归档Go程序的最基本单位,一个包中的多个源码文件是一个不可分割的整体 //二:包的导入路径 强调强调强调!!!!!! 包是一个把多个源码文件归一到一起管理的虚拟单位,一定要记住,它只是一个虚拟的概念而已,而实实在在地讲,多个源码文件是要放置到一个实实在在的文件夹下的,这个实实在在的文件夹所处的路径是包的导入路径。包的导入路径很重要,他是包的"家庭住址",是用来找到包的(用在import语句中,稍后介绍),但它绝不等同于包的概念 //三:注意的问题 1、一个文件夹下只能放置一个包,也就是所一个文件夹下放置的多个源码文件的包声明必须一致,go以此来确保一个路径就唯一定位到唯一的一个包。 2、包虽然与文件夹路径是截然不同的意思,但是为了方便记忆,包通常应该声明为文件夹的名字 例如文件夹路径/a/b/c/mypkg,包名应声明为package mypkg,mypkg就为包名
(2)包的区分与放置位置
包是虚拟的、逻辑层面的概念,但包组织的多个源码文件确实是实实在在的,一定要放置在某一文件夹下.
请注意:为了后续书写简洁,笔者直接将包所组织的多个源码文件的存放位置简称为包的存放位置,请读者务必知晓。
main包包含着程序的入口,主要用来运行,无论如何,main包可以被放置于任意文件夹下。
笔者将main包之外的包称之为其他包,具体是指内置包、自定义包、下载的第三方包。有别于main包,其他包主要用来被导入使用,放置位置如下
// 内置包 内置包固定被放置在`$GOROOT/src/`下,与任何模式无关 // 自定义包 在未启用modules模式的情况下,自定义包需要放置在GOPATH指定的任意目录下的src中 // 下载的第三方包 在未启用modules模式的情况下,使用go工具链命令下载的第三方包总是默认被存放到GOPATH的第一个目录的src下 // 强调一下 在早期的Go环境中,自定义的包与下载的第三方包都是放到了$GOPATH/src下,因为早期Go采用的是和GOPATH模式,而且即便是在GO1.14.2版本中,在我们还未学习如何使用任何新模式前,默认使用的仍是GOPATH模式
ps:
1、内置包是笔者对标准包的一种爱称
2、但凡存放于GOPATH工作区中的包,官方都称之为工作区包
(3)包的使用
// 1、一个源码文件中声明的函数、类型、变量和常量等标识符/名字对同一包中的所有其他源码文件都可见,不需要加任何前缀即可引用,因为代码包只是一种组织管理源码文件的形式,同一个包下的多个源码文件本就属于一个整体,事实上我们完全可以将一个包当成一个”大文件“去看,毫无疑问这个”大文件“中声明的标识符/名字不能重名 // 2、包名很关键 名为main的包可简称为”main包“,是程序的入口,go程序运行时会查找main包下的main函数,main函数既没有参数声明也没有结果声明,见下图 名不为main的包可称之为”其他包“,是程序的功能/属性集合,此类包用来被其他包导入使用,为何此时包名仍然很关键呢?因为我们导入时用的是导入路径(指的是包所在的路径,该路径不是绝对路径,稍后介绍),但是使用的则可能会使用"包名.xxx"
综上:包是程序功能/属性“分散管理” 、“归一使用”的一种逻辑意义上的组织形式
以上是go语言为什么以包组织代码的详细内容。更多信息请关注PHP中文网其他相关文章!