Package

所谓package(包)其实就是代码的一种组织管理方式,代码多了就需要放入文件,文件多了就需要归类放入文件夹,就好比我们在给电脑装软件时会进行归类安装,其实也是有意无意对电脑软件安装的一种管理方式。那么不同的go文件交给不同的package管理时,如果A package需要引用 B package中的文件时go是怎么处理的?基于此,我们来对go的package和module一探究竟

我们以一个例子来学习,这里假设我们做一个学生管理系统,如下代码

//学生管理系统(学生管理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中文件夹名称和包名称是可以不一样的;需要使用其它包中的方法时,引入包所在的路径,真实使用时,是通过包名.的形式去使用,

举个例子

假设文件夹名称为:student_manage,

包名为:student

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

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

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下有三个目录

  1. src: 存储我们包的路路径
  2. pkg:是存储go install的归档文件
  3. bin: 存储go的可执行文件

举个例子如下,假设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中这一切是怎么做的呢?

在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

欢迎大家关注微信公众号:“技术人技术事”,更多精彩期待你的到来

![](https://img2018.cnblogs.com/blog/706455/201908/706455-20190821134639128-1638065311.jpg)

Go中的Package和Module分析的更多相关文章

  1. Python工程文件中的名词解释---Module与Package的区别

    当我们在已有的Python工程文件中创建新的内容是,通常会有两种类型文件供你选择---Module和Package,对于初学者来说会搞不清楚这两种文件直接的关系.这里就来解释一下这两者之间的关系. M ...

  2. SQL中的Null深入研究分析

    SQL中的Null深入研究分析 虽然熟练掌握SQL的人对于Null不会有什么疑问,但总结得很全的文章还是很难找,看到一篇英文版的, 感觉还不错. Tony Hoare 在1965年发明了 null 引 ...

  3. perl的package和module

    来源: http://www.cnblogs.com/itech/archive/2010/03/23/1692836.html 一 package 1) package 相当于C++中的namesp ...

  4. ## Python中的Package和Jupyter中import包问题

    前言 关于python包的一些知识 Java中的package概念 我们知道在java中的import package概念, java中的包就是一个目录,里面包含着子目录,子目录套着子目录,当需要引入 ...

  5. Pycharm 中错误ImportError: No module named appium

    Q: Pycharm 中错误ImportError: No module named appium A: Pycharm IDE Preferences -> Project Interpret ...

  6. node.js中的exports和module.exports

    不同的编程语言都有各自的代码组织和复用的方式,如.net.php中的命名空间,python中的import,ruby中的module等,来避免命名空间污染.一直都没搞清楚node中的exports和m ...

  7. 电商系统中的商品模型的分析与设计—续

    前言     在<电商系统中的商品模型的分析与设计>中,对电商系统商品模型有一个粗浅的描述,后来有博友对货品和商品的区别以及属性有一些疑问.我也对此做一些研究,再次简单的对商品模型做一个介 ...

  8. AX中四种库存ABC分析法原理研究

    库存ABC分类,简单的说就是抓大放小,是为了让我们抓住重点,用最大精力来管理最重要的物料,而对于不太重要的物料则可以用较少的精力进行管理.它和我们平常说的八二法则有异曲同工之妙. 既然要应用库存ABC ...

  9. try-catch-finally中return的执行情况分析

    try-catch-finally中return的执行情况分析: 1.在try中没有异常的情况下try.catch.finally的执行顺序 try --- finally 2.如果try中有异常,执 ...

随机推荐

  1. windows上安装redis并安装php5.6的redis扩展

    http://www.884358.com/php-redis/ 1.安装redis Redis 没有官方的Windows版本,但是微软开源技术团队(Microsoft Open Tech group ...

  2. Activiti 工作流入门指南

    概览 如我们的介绍部分所述,Activiti目前分为两大类: Activiti Core Activiti Cloud 如果你想上手Activiti的核心是否遵循了新的运行时API的入门指南:Acti ...

  3. 求解最长回文串 manachar算法

    转载:http://blog.sina.com.cn/s/blog_70811e1a01014esn.html ;i<len;++i){ if(mx>i) p[i]=min(p[*id-i ...

  4. Python--day40--threading模块

    import time from threading import Thread class MyThread(Thread): def __init__(self,arg): super().__i ...

  5. thinkphp3.2如何自动生成后台模块并且怎么访问

    https://blog.csdn.net/whulovely/article/details/72773729 步骤一:在入口文件index.php下绑定Admin模块(这时候别再Home同级手动创 ...

  6. 【ts】 VSCode自动编译TypeScript终端报错

    一.点击终端--运行任务--选择tsc:监视 - tsconfig.json后,终端报出了如下错误:error TS5058: The specified path does not exist 在网 ...

  7. ZR1050

    ZR1050 http://www.zhengruioi.com/problem/1030 题目大意: 给定一棵带点权的树,求所有联通块的点权和的平方的和 \(n \le 10^5\) 题解 首先,关 ...

  8. ZR普转提2

    ZR普转提2 A 谢谢刁神教我A题 刚开始读错题了,以为是一个不可做的数位DP,然后就暴力滚粗 直到问了问刁神,发现自己题意是错的 然后成了比较简单的题目 直接暴力枚举每一位填什么,剩下的位数的数字都 ...

  9. FFT NTT 错误总结(持续更新)

    FFT NTT错误总结 1 处理\(r\)数组时忘记赋值 r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1)); 2 ...

  10. Crazy Binary String<Map法>

    #include<cstdio> #include<iostream> #include<map> using namespace std; map<int, ...