10-package、gomodules
10-package、gomodules
package
1、package的定义
package用来组织源码的,是多个go源码的集合。在go中内置了非常多的package(包):fmt、os、io。每个源码文件开始都必须要声明所属的package。
在python中包名就是文件名,但是在go中包名可以和文件名不一样。但是同一个目录下,所有go文件的包名必须保持一致,如果不一致会报错,例如:
- user
- user.go:package my_user
- student.go:package my_user
- main.go2、package的导入
在同一个包下的文件,可以互相使用对方的模块,不需要导入。但是不同模块之间的使用就需要导入。
2.1、相同模块之间:(user模块)
user.go:
package my_user
type User struct {
name string
age int
}student.go:
package my_user
// 直接使用同一目录下的user.go的内容
func getUser(user User) User {
return user
}2.2、不同模块之间:(user模块和main模块)
使用import导入,导入的路径以当前项目的go.mod中定义的module字段为根路径,例如:

那么在main.go文件中导入user模块的包就是:
注意:后面跟的是具体的路径,而不是包的模块名称。但是具体使用的时候,是使用的模块名称
例如main.go:
2.3、注意
由于我在my_user模块(user.go)文件,定义的结构体的name为小写开头,go中如果是小写开头,那么只能在包内部访问,如果要被外部可以访问,需要改为大写开头。需要两个文件保持一致。

main.go:
user.go:
方法也是如此:
2.4、总结
因为go没有 public/private 关键字,大写 = 包外可见, 小写 = 包内私有
3、import的其他用法
3.1、导入别名
因为在不同目录下,可能会出现同名的包,就需要使用到别名了。语法是:
3.2、全部导入
如果不想写别名,也可以将其他模块的内容全部导入到当前模块,这样就不用“模块名.xxx”了
例如:
3.3、匿名导入
使用_的方式,因为go对于没有使用的代码会报错,采用匿名导入的形式,就非常适合一段在其他模块初始化的代码,例如js的import 'init.js'
但是需要注意的是,如果在模块中需要初始化,go必须使用init作为函数名,就和main函数一样。
- main.go
- user.go
gomodules
1、初始化go mod
2、idea导入第三方包
当我在main.go中导入了第三方包,例如:
在goland的idea中,点击飘红的包,可以点击安装缺少的包。安装完成后,在go.mod中会新增非常多的依赖

- 如何查看安装的第三方包?
在idea中的“外部库”中

- 如何查看安装第三方包的路径?
idea中可以点击在所在路径打开,vscode的话是没有的,具体的包在全局的go环境所在目录

3、使用命令安装第三方包
3.1、安装一个依赖
执行后会:下载包、自动写入 go.mod、自动写入 go.sum
3.2、安装指定版本
- 安装某个版本
- 安装最新版
3.3、更新依赖
- 更新单个包
- 更新所有依赖
3.4、删除依赖
只要把代码中不需要使用依赖的代码删掉,会自动:删除未使用依赖、下载缺失依赖、整理 go.mod、整理 go.sum
3.5、安装所有依赖
类似npm i
3.6、查看包可用版本
3.7、replace命令
replace的作用是:如果我的三方包叫做github.com``/xiaotian/a,但是我希望项目中这个包是github.com``/xiaotian/project_a,那么就可以使用replace命令
4、设置go国内镜像
通过go env查看全部配置,通过go env xxx查看某个配置
设置镜像:
检查设置的内容: