能够将所有的函数定义在main.go里面吗?一个大项目里面,里面函数可能有成百上千,将这么多函数都写到一个文件里面,显然这是不合适的。所以如何将函数写到其他的地方,然后调用。
所以可以将函数写到专门的文件里面,或者其他文件里面。
包的作用就是可以分门别类的将需要的功能分散到不同的文件里面去,然后在使用的时候直接引入。
包可以在不同的包下面建不同的文件,来将函数放到对应的文件里面。
包的本质其实就是文件。一个包对应一个文件夹,一个文件夹下面很多文件,包的本质其实就是文件夹。
包名称
保持
package
的名字和目录保持一致,尽量采取有意义的包名,简短,有意义,尽量和标准库
不要冲突。包名应该为
小写单词,不要使用下划线或者混合大小写。
包导入
1)绝对路径导入
gopath管理就在 GOPATH/src 目录中查找包,如果是gomod那么就
前缀是当前的项目模块名称
,如果是外部的包那么就是整个模块的名称
import(
go 标准包
第三方包
本地包
)
import (
"day1/base/init_package"
_ "day1/base/init_package"
_ "day1/base/main_init_1"
"fmt"
)
2) 相对路径导入
gomod方式已经不支持了,只有在gopath方式下支持。在当前文件所在的目录查找,这个不建议使用,知道即可。示例:import "./gpkgname/pkg02"
3) 点导入
在调用点导入包中的成员时可以直接使用成员名称进行调用(省略包名,一般也不怎么使用)
如果有两个包,里面都有Add方法,如果都使用点导入进来,那么使用Add到底使用哪个呢?这就会出现问题,所以这种方式也少用。
4) 别名导入
当导入不同路径的相同包名时,可以别名导入为包重命名,避免冲突
5) 下划线导入
Go 不允许包导入但未使用,在某些情况下需要初始化包,使用空白符作为别名进行导入,从而使得包中的初始化函数可以执行。(有些时候使用驱动包的时候,咋们需要将包里面的东西进行初始化,只是初始化包,并不会去调用里面的函数或者变量,这个时候就得使用下划线导入。)
成员可见性
当命名(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Analysize, 那么使用这种形式的标识符的对象就可以被外部包的代码所使用
(客户端程序需要先导入这个 包),这被称为导出(像面向对象语言中的 public
);
命名如果以小写字母开头,则对包外
是不可见的,但是他们在整个包的内部是可见并且可用的(像
面向对象语言中的
private
)
Go 语言使用名称首字母大小写来判断对象(常量、变量、函数、类型、结构体、方法等)的访问权限,首字母大写标识包外可见(公开的),否者仅包内可访问(内部的)。
在包里面可以定义一些内容不想让外面去访问,写了一个函数是内部自己使用的,这就涉及到包内成员的可访问性。
包内首字母大写包外可见 ,首字母小写只能在包内可见。可见也就是能不能调用。
函数类型可见性
如果不可见成员要想被调用,可以在可见成员里面去使用,这样就可以被包外的调用者使用到。
变量类型可访问性
在外面修改这个变量也会影响到包里面的这个变量,如果是小写字母就不可以在包外访问。