前言
无论什么Python还是Golang当你的代码量达到一定程度时,就需要使用package来分类、组织我们的代码文件。
go-package概念
fmtosio
在目前我使用的go1.11.5中每1个.go文件都需要存放在Gopath路径下的1个文件中(包)。
.go文件最开始声明这是1个main包,也就是程序的入口。
初识 go-package
在go语言中1个文件夹可以称为1个包,在文件夹(包)可以创建多个.go文件。
在同1个文件夹(包)中的.go文件必须pakage关键字指定同1个包名。
在go语言中包分为2类
1.main包:使用main包可以让我们写的程序编译成1个可执行的二进制文件,所以main包就是程序的入口。
2.非main包:可以规范和分类我们在程序执行时所需要的功能
如果多个.go文件在同1个文件夹(包)中,那它们就可以直接使用相互的功能,无需导入包。
在包同定义的功能首字母大写,才可以被外部包所调用,否则只能在同1个包中使用。
使用package
定义package
一般来说除了1个程序入口(main包)之外,在Go项目中其他都是我们程序开发人员***定义的(工具包),以便调用。
mai包可以生成1个可执行文件。
我们使用package关键字定义1个包,
如果当前package想要被其他包调用,那么该工具包中的标识符(变量名、函数名、struct名、interface名)首字母大写表示可见性(对外可见)。
在Go中1个文件夹就是1个package, 所以package中的.go文件一般会和package同名。
programmer.go
init函数
包中的init函数在调用该包时自动执行
init()函数执行顺序
main
Golang中1个包可以包含1个init函数,不一样的是这个init函数需要自己定义。
init()
导入package
调用Go里面的包需要从Go project的src目录后面的文件夹开始import。
hello/package_practice/devlepment
go mod第三方依赖包管理
为什么需要go mod?
Golang中所有的项目、项目依赖的第三方库,默认情况下全部放在go path/src这1个目录下。
如果要使用N个不同版本的第三方依赖库,应该怎么解决?有没有Python env这种环境隔离机制?
1.godep依赖包管理
vendorvendor
安装
基本命令
使用godep
godep saveGodepsvender
GodepsGodeps.json
vender
vender机制
Go1.5版本之后开始支持,能够控制Go语言程序编译时依赖包搜索路径的优先级。
如果项目require某个依赖包,如果你有vendor目录。
vender$GOAPTH/src
godep开发流程
godep saveGodeps.json
2.go module依赖包管理
go modulego module
0.如果你使用的是go 1.13之前的版本,那么在使用go mod之前需要手动开启对go mod的支持:
go moduleGO111MODULEoffonautoauto
GO111MODULE=offGOPATHvendorGO111MODULE=onGOPATHvendorgo.modGO111MODULE=auto$GOPATH/srcgo.mod
GO111MODULE=ongo module
go.modgo.sum
go.mod:有的像node.js的pakage.json存储当前项目所有依赖库的版本
go.sum:所有依赖的集合
我使用的就是go1.13所以不需要每次都开启go mod模式。
go mod命令
我们使用go mod无非处于2种目的
目的1.我自己开发的项目生成go.mod让别人同步我的依赖包
目的2.别人写得项目,我跟他的依赖包版本保持一致。
自己生成go.mod流程
go mod文件语法
go.mod文件记录了项目所有的依赖信息,其结构大致如下:
replace语法
在国内访问golang.org/x的各个包都需要FQ,你可以在go.mod中使用replace替换成github上对应的库。
go get
go get
go get -ugo get -u=patchgo get package@version
go mod download
3.运行1个gin项目
我使用go 1.14版本结合go mod,在go path之外运行1个gin项目。
go mod环境已经准备完毕 ,开始写代码吧。
代码写完了就开始运行代码吧。
4.依赖包版本迭代
修改go.mod文件中的require版本即可。
5.重启
go mod第三方包管理比Python还方便,不用自己去 pip install requirement.txt了。
运行时自动根据go.mod更新。