一、Go的安装
该教程针对windows环境,linux和mac环境请自行举一反三
自行到go官网下载msi安装器
default ${GOROOT} C:\Program Files\go
default ${GOPATH} ~\go
二、目录说明
${GOROOT}可以理解为sdk根目录,所有的标准库都在${GOPATH}\src目录下。
${GOPATH}有两种使用方式,一种式作为project目录,第二种式作为lib目录。
三、go项目的模块管理
从go1.11开始,go新增加了一种模块管理方案–GOMOD方案,原来的经典方案为GOPATH方案。其中一个核心文件就是go.mod文件,这个文件其实就是一个项目依赖管理文件,还有一个go.sum文件。如果你有过npm,composer开发经验,那么你可以类比为{“package.json”,“package-lock.json”}或者{“composer.json”,“composer-lock.json”}
如果你开始使用go编程,那么你第一件事情就是要决定你所使用的模块管理模式,是GOPATH模式还是GOMOD模式。
四、包和模块
4.1什么是包
go的代码管理是基于目录的,因此一个目录就是一个包。如果你所在的目录为one,那么所有在这个目录下的所有源文件的所属包为one.包下可以有多个源文件,源文件的名字没有限制,对于编程人员来说,可以将源文件名字作为包下的分类器,例如{“data.go”,“struct.go”,“interface.go”,“code.go”};而包名为聚类器,所有包下具有相同包名的源文件内的成员同属于一个包。
问题1:如果我在one包下定义一个源文件c.go,但是我打的包为package two,是否可以?
这是不可以的,如果你自己试过,你会发现,goland会提示你在one目录下建立一个two目录。
4.2什么是模块
模块是包集合的索引,如果你用过go,你肯定知道${GOPATH}\src目录,这个目录下的所有目录都是模块,但是模块目录下的目录不是模块,如果你把模块目录下的目录移到模块目录下,它就变成了模块。这是由go的模块加载决定的。(我想你是知道它基于路径的加载机制的)。所有我们定义可以由go直接加载的根目录下的目录即为模块。
五、GOPATH模式
GOPATH模块管理会自动加载 ${GOROOT}\src和 ${GOPATH}\src目录下的模块
设置go env 中的字段GO111MODULE=off
go get ${github}/ ${person或者organization}/ ${repository}
这样就可以将github上的共享代码安装到你的项目目录下的src目录下了。现在第三方模块,本地模块,主模块都在 ${GOPATH}\src目录下
六、GOMOD模式
GOMOD模块管理会自动加载 ${GOROOT}\src和 ${GOPATH}\pkg\mod目录下的模块
设置go env 中的字段GO111MODULE=on,如果使用goland开发,请到file->setting->module中勾选mod模式
由于模块指向改变到了mod目录下,所以你在模块根目录下必须放置一个go.mod文件,里面的字段module就是你的包名。当然现在你是否将主模块放置到src下都是可以的,但是为了管理项目,不建议将模块保存到其他的位置。你在开发的过程中,引用主模块下的包时候,你可以直接通过你的module字段来索引,哪怕它不是在mod目录下
go mod download 命令可以将mod文件中定义的模块下载下来
七、如何制作共享包
共享包的制作非常简单,实际就是一个git仓库,它会按照 github/author/repository-name的目录组织到你的模块目录中。这样实际上它都帮你做命名空间了,不用担心你的包和别人重名了。gopath模式没有版本管理,所以直接下载就可以,但是mod模式有版本管理,所以你在制作包的时候需要打上vx.x.x这样的版本标签,在go.mod中require中定义 hostname/author/repository v1.0.0(github.com/xxx/xxx v1.0.0)这样去定义,然后用go mod download去安装。当然go mod还有其他的管理命令,自行去了解。