go - 包管理

1.包管理

1.1 概述

go语言是使用包来组织源代码的,包是多个go源文件的集合,任何源码文件都必须属于某个包,源文件的第一行有效代码必须是package packageNam 语句 该语句是声明所在的包名称

注意事项:

  1. 包名一般是小写的,见名知意,包名中不能包含- 等特殊符号。

  2. 包名规范上要和所在的目录同名,也可以不同

  3. 包名为 main 的包为应用程序的入口包,编译不包含 main 包的源码文件时不会得到可执行文件。

  4. 一个文件夹下的所有源码文件只能属于同一个包,同样属于同一个包的源码文件不能放在多个文件夹下.

  5. 一个包下的不同文件不能含有同名函数

  6. 如果想在一个包中引用另外一个包里的标识符(如变量、常量、类型、函数等)时,该标识符必须是对外可见的(public),在Go语言中只需要将标识符的首字母大写就可以让标识符对外可见

1.2 包导入方式

  1. import “包” (此处的包是指存放源文件的父级目录名称,调用时则使用每个go源文件中package 声明的包名称进行调用)

  2. import Alias name “包” (别名方式导入,后续调用使用别名.方法或属性 进行调用)

  3. import . “包” ( 通过. 来表示,将该包中的所有变量及方法导入,调用时不需要使用任何前缀,直接调用即可

  4. import _ “包” (表示只执行包中的init函数方法,不导入包中的其他任意数据)

1.3 包加载顺序

init()函数会在每个包完成初始化后自动执行,并且执行优先级比main函数高。

Init函数通常被用作

  • 对变量进行初始化

  • 检查/修复程序的状态

  • 注册

  • 运行一次计算

注意事项

  1. 一个包可以有多个 init 函数,包加载时会执行全部的 init 函数,但并不能保证执行顺序,所以不建议在一个包中放入多个 init 函数,将需要初始化的逻辑放到一个 init 函数里面。

  2. 包不能出现环形引用的情况,比如包 a 引用了包 b,包 b 引用了包 c,如果包 c 又引用了包 a,则编译不能通过。

  3. 包的重复引用是允许的,比如包 a 引用了包 b 和包 c,包 b 和包 c 都引用了包 d。这种场景相当于重复引用了 d,这种情况是允许的,并且 Go 编译器保证包 d 的 init 函数 只会执行一次

  4. init()函数没有参数也没有返回值。 init()函数在程序运行时自动被调用执行,不能在代码中主动调用它。

在这里插入图片描述

1.4 GOPATH方式

在go1.11版本之前都是使用GOPATH 进行包管理,

需要将项目代码放在GOPATH/src目录下, 在导入包时从src之后的目录开始导入(不包含src目录层级)

注意:

1.将GO111MODULE 设置为auto 或off

go env -w GO111MODULE=“off/auto”

1.4.1 env环境配置

go env  |grep -i  gopath
GOPATH="/Users/dongdong/Desktop/mydir/self/golang"
# 可通过 go env -w  GOPATH="xxxxx" 进行设置路径

1.4.2 导入包查找顺序

GOROOT/src -----> GOPATH/src
在这里插入图片描述
在这里插入图片描述

db包

[

若将mysite移出GOPATH/src目录以外的地方,执行会报错,这就是GPATH包管理的一种缺陷.

1.5 GOMODULE

由于GOPATH包管理的缺陷,在go1.11以后出现了go module管理方式

1.5.1 env环境配置

需要将GO111MODULE参数设置为auto或者on状态

go env   |grep -i  module
GO111MODULE="auto"
# 可通过  go env  -w  GO111MODULE="auto/on" 进行设置

1.5.2 go mod使用

  • go mod init(初始化项目仓库)
cd mysite 
go mod  init  [module 名称]  module若不写 则默认为父级目录名称,后续此项目中导入包
就以mysite(只针对mysite项目下的包相互导入时)

# 会生成一个go.mod文件,文件内容如下(go.mod存在则删除后再执行go mod  init)
module mysite
go 1.17

此时将mysite项目放在系统的任意位置,都可以正常执行

  • go mod tidy(包依赖检测,必须有go.mod文件存在)
cd mysite 
go mod  tidy 
# 会自动添加项目缺失的模块以及移除不需要的模块
# 添加的模块文件存放在GOPATH/pkg/mod  目录下
# 并将拉取的包信息(地址,版本)存放在go.mod文件中
  • go mod verify(检查下载下来的文件有没有修改过)

检查当前模块的依赖是否全部下载下来,是否下载下来被修改过。如果所有的模块都没有被修改过,那么执行这条命令之后,会打印all modules verified

cd mysite
go mod verify
all modules verified
  • go mod vendor

在项目目录下生成vendor文件夹,用来区分某些库的不同版本。该文件夹下将会放置你go.mod文件描述的依赖包,文件夹下同时还有一个文件modules.txt,它是你整个工程的所有模块。在执行这条命令之前,如果你工程之前有vendor目录,应该先进行删除

cd mysite 
go mod vendor
不同版本。该文件夹下将会放置你`go.mod`文件描述的依赖包,文件夹下同时还有一个文件`modules.txt`,它是你整个工程的所有模块。在执行这条命令之前,如果你工程之前有vendor目录,应该先进行删除

```Shell
cd mysite 
go mod vendor
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值