我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Go语言包和包管理详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Go语言包和包管理详解

1 包简介

1.1 工作空间

go语言的工作空间必须由 bin、pkg、class="lazy" data-src三个目录组成,可以在GOPATH环境变量中添加多个工作空间,但不能和GOROOT相同。通常go get使用第一个工作空间保存下载的第三方库

workspace
	|
	+--- bin // go install 安装目录。
	|	  |
	| 	  +--- learn
	|
	|
	+--- pkg // go build ⽣成静态库 (.a) 存放目录。
	| 	  |
	|	  +--- darwin_amd64
	| 			|
	| 			+--- mylib.a
	| 					|
	| 					+--- mylib
	|						 |
	|						 +--- sublib.a
	|
	+--- class="lazy" data-src // 项目源码目录。
		  |
		  +--- learn
		  | 	 |
		  | 	 +--- main.go
		  |
		  |
		  +--- mylib
				 |
				 +--- mylib.go
				 |
				 +--- sublib
						|
						+--- sublib.g

1.2 源文件

  • 编码:源码⽂件必须是 UTF-8 格式,否则会导致编译器出错。
  • 结束:语句以 “;” 结束,多数时候可以省略。
  • 注释:⽀持 “//”、 “” 两种注释⽅式,不能嵌套。
  • 命名:采⽤ camelCasing ⻛格,不建议使⽤下划线。

1.3 包命名

::: tip 包命名惯例

  • 给包命名的惯例是使用包所在目录的名字。这让用户在导入包的时候,就能清晰地知道包名。
  • 尽量使用简介明了的名字,但要避免冲突
  • 包名一般使用单数的形式,但是避免冲突的用的复数比如bytes,errors,strings等
  • 要避免包名有其他含义。比如 temp这种
  • 命名时考虑包名和成员如何配合,尽量减少包名和成员有重复 :::

1.4 main 包

  • 所有用 Go 语言编译的可执行程序都必须有一个名叫 main 的包。 go语言的编译器会将这种名字的包编译为二进制可执行文件。
  • main包下肯定会有名为main()的函数,main()是程序的入口。
  • 编译完会使用声明 main 包的代码所在的目录的目录名作为二进制可执行文件的文件名

2导包

关键字 Import ,进行导包。未使用的导入包,会编译错误。

2.1 两种方式

import a import b,…多次导入,以及import(a b c) 批量导入,如果导入的包不使用会报错。

import "fmt"
//或者
import(
	"fmt"
    "time"
)

2.2 包的别名

import(
	io "fmt"
)
io.Println("hello world") //别名可以直接用,在包重名时很有用

2.3 简洁模式

import (
	. "fmt"  //但是为了别人好看,一般还是不用这种
)
func main(){
	Println("hello")
}

2.4非导入模式(匿名导入)

即导入一个包并不使用它。如果不加_,就会出现编译错误。 在这里用下划线 _ 重命名导入的包。只导入,不使用。 但是这个包它进行了初始化,一般在init函数调用,这样做的好处是,有些包我们不显示使用它,但是有可能用到它,或者由用户选择使用哪个。比如 对特定图像驱动包的初始化,在我们格式化转换图片用到。还有 database/sql包,可以先都初始化,让用户选择不同的数据库驱动。

import _ "test"     //非导入模式:仅让该包执行初始化函数

2.5 导包的路径

一般情况下是包的相对路径。比如import "learn/test",标准库中的包会在安装 Go 的位置找到,即GOROOT。 Go 开发者创建的包会在 GOPATH 环境变量指定的目录里查找。GOPATH 指定的这些目录就是开发者的个人工作空间。

2.6 远程导入

目前的大势所趋是,使用分布式版本控制系统(Distributed Version Control Systems, DVCS) 来分享代码,如 GitHubLaunchpad 还有 Bitbucket。 Go 语言的工具链本身就支持从这些网站及 类似网站获取源代码。 Go 工具链会使用导入路径确定需要获取的代码在网络的什么地方。

比如:import "github.com/xxxx/xxx",用导入路径编译程序时, go build 命令会使用 GOPATH的设置,在磁盘上搜索这个包。事实上, 这个导入路径代表一个URL,指向 GitHub上的代码库。如果路径包含 URL,可以使用 Go 工具链从 DVCS 获取包,并把包的源代码保存在GOPATH指向的路径里与 URL 匹配的目录里。这个获取过程 使用 go get 命令完成。

go get 将获取任意指定的 URL 的包,或者一个已经导入的包所依赖的其 他包。由于 go get的这种递归特性,这个命令会扫描某个包的源码树,获取能找到的所有依赖包。

3 初始化 init

每个包可以包含任意多个 init 函数,这些函数都会在程序执行开始的时候被调用。所有被编译器发现的 init 函数都会安排在 main 函数之前执行。 init 函数用在设置包、初始化变量或者其他要在程序运行前优先完成的引导工作。举例如下

 package postgres
 import (
	 "database/sql"
 )
 func init() { //初始化函数
     //这里省略。。
	 sql.Register("postgres", new(PostgresDriver))
 }

3.1 init总结

  • 每个源⽂件都可以定义⼀个或多个初始化函数。
  • 编译器不保证多个初始化函数执行次序。
  • 初始化函数在单⼀线程被调用,仅执行⼀次。
  • 初始化函数在包所有全局变量初始化后执行。
  • 在所有初始化函数结束后才执行 main.main。
  • 无法调用初始化函数。

4 包管理

4.1 演变过程

  • 2013年:Gedep,社区第一个包管理工具
  • 2015年:vendor,Golang官方(golang1.5)
  • 2016、2017 年:dep、manul、Godep、Govendor、godm (Govendor胜出)
  • go module是Go1.11版本之后官方推出的版本管理工具,并且从Go1.13版本开始,go module将是Go语言默认的依赖管理工具。

4.2 Go Model优点

  • 不必须将项目目录放在GOPATH中
  • 不使用vendor目录,而是统一安装到$GOPATH/pkg/mod/cache
  • build/run时,自动析出项目import的包并安装

4.3 启用go module

要启用go module支持首先要设置环境变量GO111MODULE,通过它可以开启或关闭模块支持,它有三个可选值:off、on、auto,默认值是auto。 设置GO111MODULE=on之后就可以使用go module了,以后就没有必要在GOPATH中创建项目了,并且还能够很好的管理项目依赖的第三方包信息。 使用 go module 管理依赖后会在项目根目录下生成两个文件go.modgo.sum

  • GO111MODULE=off禁用模块支持,编译时会从GOPATHvendor文件夹中查找包。
  • GO111MODULE=on启用模块支持,编译时会忽略GOPATHvendor文件夹,只根据 go.mod下载依赖。
  • GO111MODULE=auto,当项目在$GOPATH/class="lazy" data-src外且项目根目录有go.mod文件时,开启模块支持。

4.4 GOPROXY

Go1.13之后GOPROXY默认值为proxy.golang.org,在国内是无法访问的,所以十分建议大家设置GOPROXY

5 go mod详解

5.1 go mod命令

常用的go mod命令如下:

go mod命令描述
go mod download下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)
go mod edit编辑go.mod文件
go mod graph打印模块依赖图
go mod init初始化当前文件夹, 创建go.mod文件
go mod tidy增加缺少的module,删除无用的module
go mod vendor将依赖复制到vendor下
go mod verify校验依赖
go mod why解释为什么需要依赖

5.2 go.mod说明

go.mod文件记录了项目所有的依赖信息,其结构大致如下:

module github.com/ourlang/studygo/myblog
go 1.13
require (
	github.com/DeanThompson/ginpprof v0.0.0-20190408063150-3be636683586
	github.com/gin-gonic/gin v1.4.0
	github.com/go-sql-driver/mysql v1.4.1
	github.com/jmoiron/sqlx v1.2.0
	github.com/satori/go.uuid v1.2.0
	google.golang.org/appengine v1.6.1 // indirect
)
  • module用来定义包名
  • require用来定义依赖包及版本
  • indirect表示间接引用

5.2.1 依赖的版本

go mod支持语义化版本号,比如go get foo@v1.2.3,也可以跟git的分支或tag,比如go get foo@master,当然也可以跟git提交哈希,比如go get foo@e3702bed2。关于依赖的版本支持以下几种格式:

gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7
gopkg.in/vmihailenco/msgpack.v2 v2.9.1
gopkg.in/yaml.v2 <=v2.2.1
github.com/tatsushid/go-fastping v0.0.0-20160109021039-d7bb493dee3e
latest

5.2.2 replace

在国内访问golang.org/x的各个包都需要翻墙,你可以在go.mod中使用replace替换成github上对应的库。

replace (
	golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac => github.com/golang/crypto v0.0.0-20180820150726-614d502a4dac
	golang.org/x/net v0.0.0-20180821023952-922f4815f713 => github.com/golang/net v0.0.0-20180826012351-8a410e7b638d
	golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
)

5.3 go get

::: tip 在项目中执行go get命令可以下载依赖包,并且还可以指定下载的版本。

  • 运行go get -u将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号)
  • 运行go get -u=patch将会升级到最新的修订版本
  • 运行go get package@version将会升级到指定的版本号version
  • 如果下载所有依赖可以使用go mod download命令。 :::

5.3.1 整理依赖

我们在代码中删除依赖代码后,相关的依赖库并不会在go.mod文件中自动移除。这种情况下我们可以使用go mod tidy命令更新go.mod中的依赖关系

5.4 go mod edit

5.4.1 格式化

因为我们可以手动修改go.mod文件,所以有些时候需要格式化该文件。Go提供了一下命令:

go mod edit -fmt

5.4.2 添加依赖项

go mod edit -require=golang.org/x/text

5.4.3 移除依赖项

如果只是想修改go.mod文件中的内容,那么可以运行go mod edit -droprequire=package path,比如要在go.mod中移除golang.org/x/text包,可以使用如下命令

go mod edit -droprequire=golang.org/x/text

6 项目中使用go module

6.1 现有项目

如果需要对一个已经存在的项目启用go module,可以按照以下步骤操作:

  • 在项目目录下执行go mod init,生成一个go.mod文件。
  • 执行go get,查找并记录当前项目的依赖,同时生成一个go.sum记录每个依赖库的版本和哈希值

6.2 新项目

对于一个新创建的项目,我们可以在项目文件夹下按照以下步骤操作:

  • 执行go mod init 项目名命令,在当前项目文件夹下创建一个go.mod文件。
  • 手动编辑go.mod中的require依赖项或执行go get自动发现、维护依赖。

以上就是Go语言包和包管理详解的详细内容,更多关于Go语言包及管理的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Go语言包和包管理详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Go语言包管理:依赖关系解析

go语言依赖解析至关重要,通过编译器解析main包的依赖,并使用模块和go.mod文件管理依赖关系。可以使用go get命令安装依赖,go mod upgrade命令更新依赖,go list -m命令列出依赖,go mod tidy命令锁定
Go语言包管理:依赖关系解析
2024-04-03

Go语言os包用法详解

本文主要介绍了Go语言os包用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-14

Go mod包管理工具详解

Go mod作为Go语言的官方包管理工具,可以帮助开发者更好地管理包和依赖,提高开发效率和项目可维护性,本文将介绍Go语言的包和依赖管理,以及Go mod的作用和优势,需要的朋友可以参考下
2023-05-19

Go语言基础之Time包详解

Time包是Go语言中用于处理时间的一个标准库。它提供了一系列函数和类型,用于获取当前时间、时间格式化、时间计算等操作。在Go语言中,时间的表示方式主要有两种:时间点(time point)和持续时间(duration)。时间点是指具体的一
2023-08-29

深入理解Go语言包依赖

go 语言的包依赖基于模块概念,通过 go mod 命令管理依赖。最佳实践包括使用清晰的模块路径、指定依赖版本、使用依赖锁定和优先使用标准库。实战案例说明了如何通过 go get 命令下载并安装依赖项,然后在程序中使用它们。通过遵循这些原则
深入理解Go语言包依赖
2024-04-04

详解node中的包和包管理工具

本篇文章带大家深度解析一下node的包和强大的包管理工具,希望对大家有所帮助!
2022-11-24

go语言如何处理TCP拆包/粘包

这篇文章主要讲解了“go语言如何处理TCP拆包/粘包”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“go语言如何处理TCP拆包/粘包”吧!part 1最近在学习go自带的rpc,看完了一遍想着
2023-06-22

Go语言包管理与依赖关系分析

go语言包管理最佳实践包括使用go mod命令来初始化、更新和锁定依赖关系。依赖关系分析可以通过使用go mod graph命令生成依赖关系图。实战案例演示了如何使用go get命令升级依赖关系版本,然后使用go mod tidy和go m
Go语言包管理与依赖关系分析
2024-04-03

Go语言包管理实践:依赖性探讨

go 语言包管理采用 go 模块系统,将依赖关系组织成树形结构,自动解析和下载依赖项。实战中,通过在 go.mod 文件中指定模块路径和版本号,即可引入第三方库。go 模块支持精确指定依赖版本,并自动解析依赖冲突,采用最小兼容版本。为了有效
Go语言包管理实践:依赖性探讨
2024-04-03

GO语言的控制语句详解包括GO语言的指针语法

这篇文章主要介绍了GO语言的控制语句详解包括GO语言的指针语法,GO语言switch结构,GO语言for的4种结构需要的朋友可以参考下
2022-12-19

Go语言中包的导入规范详解

Go 语言中包的导入规范详解在 Go 语言中,包(package)是代码的组织单元,用于组织和管理代码。通过包的导入,我们可以在代码中引用其他包提供的功能和类型。在 Go 中,包的导入规范非常重要,能够帮助代码更有组织性、易读性和可维护性
Go语言中包的导入规范详解
2024-03-12

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录