Go语言包和包管理详解_第1页
Go语言包和包管理详解_第2页
Go语言包和包管理详解_第3页
Go语言包和包管理详解_第4页
Go语言包和包管理详解_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第Go语言包和包管理详解目录1包简介1.1工作空间1.2源文件1.3包命名1.4main包2导包2.1两种方式2.2包的别名2.3简洁模式2.4非导入模式(匿名导入)2.5导包的路径2.6远程导入3初始化init3.1init总结4包管理4.1演变过程4.2GoModel优点4.3启用gomodule4.4GOPROXY5gomod详解5.1gomod命令5.2go.mod说明5.2.1依赖的版本5.2.2replace5.3goget5.3.1整理依赖5.4gomodedit5.4.1格式化5.4.2添加依赖项5.4.3移除依赖项6项目中使用gomodule6.1现有项目6.2新项目

1包简介

1.1工作空间

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

workspace

+---bin//goinstall安装目录。

|+---learn

+---pkg//gobuild⽣成静态库(.a)存放目录。

|+---darwin_amd64

|+---mylib.a

|+---mylib

|+---sublib.a

+---src//项目源码目录。

+---learn

|+---main.go

+---mylib

+---mylib.go

+---sublib

+---sublib.g

1.2源文件

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

1.3包命名

:::tip包命名惯例

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

1.4main包

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

2导包

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

2.1两种方式

importaimportb,多次导入,以及import(abc)批量导入,如果导入的包不使用会报错。

import"fmt"

import(

"fmt"

"time"

2.2包的别名

import(

io"fmt"

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

2.3简洁模式

import(

."fmt"//但是为了别人好看,一般还是不用这种

funcmain(){

Println("hello")

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

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

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

2.5导包的路径

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

2.6远程导入

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

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

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

3初始化init

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

packagepostgres

import(

"database/sql"

funcinit(){//初始化函数

//这里省略。。

sql.Register("postgres",new(PostgresDriver))

3.1init总结

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

4包管理

4.1演变过程

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

4.2GoModel优点

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

4.3启用gomodule

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

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

4.4GOPROXY

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

5gomod详解

5.1gomod命令

常用的gomod命令如下:

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

5.2go.mod说明

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

module/ourlang/studygo/myblog

go1.13

require(

/DeanThompson/ginpprofv0.0.0-20250408063150-3be636683586

/gin-gonic/ginv1.4.0

/go-sql-driver/mysqlv1.4.1

/jmoiron/sqlxv1.2.0

/satori/go.uuidv1.2.0

/appenginev1.6.1//indirect

module用来定义包名require用来定义依赖包及版本indirect表示间接引用

5.2.1依赖的版本

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

gopkg.in/tomb.v1v1.0.0-20141024135613-dd632973f1e7

gopkg.in/vmihailenco/msgpack.v2v2.9.1

gopkg.in/yaml.v2=v2.2.1

/tatsushid/go-fastpingv0.0.0-20160109021039-d7bb493dee3e

latest

5.2.2replace

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

replace(

/x/cryptov0.0.0-20250820150726-614d502a4dac=/golang/cryptov0.0.0-20250820150726-614d502a4dac

/x/netv0.0.0-20250821023952-922f4815f713=/golang/netv0.0.0-20250826012351-8a410e7b638d

/x/textv0.3.0=/golang/textv0.3.0

5.3goget

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

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

5.3.1整理依赖

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

5.4gomodedit

5.4.1格式化

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

gomodedit-fmt

5.4.2添加依赖项

gomodedit-require=/x/text

5.4.3移除依赖项

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

gomodedit-droprequire=/x/text

6项目中使用gomodule

6.1现有项目

如果需要对一个已经存在的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论