所谓package(包)其实就是代码的一种组织管理方式,代码多了就须要放入文件,文件多了就须要归类放入文件夹,就比如咱们在给电脑装软件时会进行归类安装,其实也是有意无心对电脑软件安装的一种管理方式。那么不一样的go文件交给不一样的package管理时,若是A package须要引用 B package中的文件时go是怎么处理的?基于此,咱们来对go的package和module一探究竟java
咱们以一个例子来学习,这里假设咱们作一个学生管理系统,以下代码git
//学生管理系统(学生管理package,成绩管理package,主package) student_manage_system student_manage student.go achievement_manage achievement.go main main.go student.go文件内容以下 package student_manage func QueryStudent(no string) Student{ } //main.go 文件内容以下 package main import student_manage func main() { student := sutdent_manage.QueryStudent("stuNo") }
在main包须要依赖student_manage包查询学生对象,在go中是经过import
关键字导入咱们须要使用的包的路径,什么是包,什么是包的路径?以student_manage文件夹 和package后面写的student_manage为例,乍一看,如出一辙,没什么区别;其实否则,在go中文件夹名称和包名称是能够不同的;须要使用其它包中的方法时,引入包所在的路径,真实使用时,是经过包名.的形式去使用,github
举个例子golang
那么在main中使用时,应该import student_manage ,但真实调用其方法时应该是student.QueryStudent("stuNo"),在真实项目中,go官方建议文件夹名称和包的名称同样,以防止歧义产生,同时尽可能简短。redis
理解了package,那么go是如何寻找包路径的,看下面代码chrome
package main import( "fmt" "student_manage" ) func main(){ }
bin: 存储go的可执行文件微信
举个例子以下:maven
D:\mygo\ src student_manage_system(项目名称) student_manage student.go main mian.go pkg 存储最后打包后的归档文件 bin 存储执行文件
举个例子,咱们在使用别人的包的时候须要引入,好比小明开发了一个消息中间件MQ,咱们在使用时如何引入小明的包,了解Java的人都知道Maven, Java中包的管理,依赖,版本等是经过maven中央仓库引入,也就是你开发一个Java程序能够打成jar包,上传maven中央仓库,那么别人使用是就能够经过mavnen坐标来引入你开发的jar,那么go中这一切是怎么作的呢?ide
在Go1.11以后go官方推出了Go Module,在这以前Go的包管理百花齐放(也意味着比较混乱),主流的有 govender,glide,gopm,以及半官方的 dep,这里对这些不作介绍,感兴趣的能够去google一下,咱们主要学习一下Go官方的Module学习
刚才咱们提到了java的maven中央仓库,谁开发了谁上传,谁想用谁下载,go也有这么一个中央仓库,就是大名鼎鼎的 github,咱们还以学生管理系统为例,在说项目以前,再说一下gopath,在go1.11以后,gopath概念淡化了许多,再也不是之前的结构,gopath的做用是存储项目依赖的包路径,项目自己能够建立在任何地方
//go1.11以后gopath 默认gopath路径,当前系统帐户目录下会有一个go目录,以下 C:/Users/sunpengwei/go pkg mod 总体目录是 C:/Users/sunpengwei/go/pkg/mod
student_manage_system 在根目录下执行 go mod init 会在项目目录下生成一个go.mod文件, 文件内容是module student_manage_system(module的名称) go 1.12(go的版本)
有了go.mod 文件,假设咱们须要引用一个redis第三方包
go.mod 中有两个关键字 reuqire replace
require字段: require github.com/gomodule/redigo v2.0.0+incompatible
require 表明必须,必要的, github.com/gomodule/redigo 是包的路径 v2.0.0是版本 +incompatible暂且不讨论,这样咱们就在项目中使用了redigo包,就可使用redigo包中的方法了,在真实使用时咱们只须要的是导入具体的包,以下代码示例
module student_manage_system require github.com/gomodule/redigo v2.0.0+incompatible go 1.12 package main import( "github.com/gomodule/redigo/redis" ) func main(){ }
replace字段,从字面理解意思是替换
假设学生管理系统有两个包student_manage和achievement_manage
如今achievement_manage包须要使用student_manage包中的方法怎么办?咱们的项目托管给了github,
此时包路径为 github.com/sunpengwei1992/student_manage_system,
但这时咱们能的代码并无上传至github,这个时候replace字段就开始使用了,咱们对包路径进行了替换 。
把github.com/sunpengwei1992/student_manage_system替换成 ./
在本地使用时只须要经过 ./student_manage使用就能够了
replace github.com/sunpengwei1992/student_manage_system v1.0.0 => ./
go mod init module_name 初始化mod文件 go mod tidy 下载依赖的包 go get github.com/jtianling/goModule@latest 的形式更新到最新版 go get -u 的形式升级全部的依赖库 go mod edit -require="github.com/chromedp/chromedp@v0.1.0" 修改指定的版本,修改以后执行第二步
git tag查询全部的tag git tag -a v1.0 -m "对Tag的描述信息" git push origin --tags
欢迎你们关注微信公众号:“golang那点事”,更多精彩期待你的到来