Go中的Package和Module分析

Package

  • 所谓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

  • 假设文件夹名称为:student_manage,
  • 包名为:student
  • 那么在main中使用时,应该import student_manage ,但真实调用其方法时应该是student.QueryStudent("stuNo"),在真实项目中,go官方建议文件夹名称和包的名称同样,以防止歧义产生,同时尽可能简短。redis

  • 理解了package,那么go是如何寻找包路径的,看下面代码chrome

package main
import(
    "fmt"
    "student_manage"
)
func main(){
}
  • 如上代码中,咱们引入了fmt包,student_manage包,咱们知道fmt是go sdk中的包,student_manage是咱们本身的包,在go中,有两个变量:goroot和gopath
  • GOOOT
  • goroot指的是go的安装路径,好比 D:\sdk\go12;在这个目录下有一个src的文件夹 D:\sdk\go12\src,你们能够点进去看一下,在里面你会找到fmt包。
  • GOAPTH
  • gopath是go项目的路径,咱们开发一个学生管理系统,经过gopath指定学生管理系统路径
  • gopath下有三个目录
  • src: 存储咱们包的路路径
  • pkg:是存储go install的归档文件
  • bin: 存储go的可执行文件微信

  • 举个例子以下:maven

  • 假设gopath指定路径D:\mygo,那么最终目录结构为
     
  D:\mygo\
        src
            student_manage_system(项目名称)
                student_manage
                    student.go
                main
                    mian.go
        pkg
            存储最后打包后的归档文件
        bin
            存储执行文件

Module

  • 举个例子,咱们在使用别人的包的时候须要引入,好比小明开发了一个消息中间件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
  • go module具体如何使用呢?咱们在github上新建一个学生管理系统,而后git clone到本地
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 module 经常使用的一些命令
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来作到的
git tag查询全部的tag
git tag -a v1.0 -m "对Tag的描述信息"
git push origin --tags
  • 你们能够看我github的代码测试:https://github.com/sunpengwei1992/go_module_test

欢迎你们关注微信公众号:“golang那点事”,更多精彩期待你的到来

相关文章
相关标签/搜索