GO环境goland及初始化项目(二)
Go的安装
补充说明:由于VS Code对go mod模式的支持暂时还不够完善,建议大家使用Goland编辑器。
不管是Windows还是MacOS都是非常简单快捷,将安装包下载好后直接一步到位next即可(也可以使用goland直接安装)
Linux下的安装,就是将下载的Linux安装包中的go
文件夹,解压到/usr/local
路径即可
在控制台输入go version
,如果显示了版本号,即代表安装成功
Go环境变量的配置
安装成功后,环境变量的配置也没有以前那么麻烦
仅需要几步操作即可
1、设置GOROOT和GOPATH路径(GOPATH路径是我们的工作区)
go env -w GOPATH=我们自己的工作区路径
例如我的就设为 /Users/naonao/go
2、开启go module,配置goproxy
$ go env -w GO111MODULE=on // Windows
$ export GO111MODULE=on // macOS 或 Linux
阿里配置:
$ go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/ // Windows
$ export GOPROXY=https://mirrors.aliyun.com/goproxy/ // macOS 或 Linux
七牛云配置:
$ go env -w GOPROXY=https://goproxy.cn // Windows
$ export GOPROXY=https://goproxy.cn // macOS 或 Linux
3、重要的环境变量
Go
通过环境变量来做项目上的管理和控制,通过命令 go env
可以查看相关变量:
C:\Users\user>go env
set GO111MODULE=on
set GOPATH=E:\go
set GOPROXY=https://goproxy.cn,direct
set GOROOT=D:\install\Go
set GOSUMDB=sum.golang.org
关键环境变量:
GOROOT
: Go
的安装目录,即可执行文件所在的目录;
GOPATH
:工作目录并不是项目所有目录,编译后的二进制文件存放地, import
包的搜索路径,主要包含 bin
、 pkg
、 src
;
GO111MODULE
:启用 go module
管理项目,需要有 go.mod
和 go.sum
文件;
GOPROXY
:下载依赖时的代理,必须配置,不然无法成功下载;
初始化项目
# 创建project的目录
$ mkdir gproject
# 进入目录
$ cd gproject/
# 初始化
E:\go>go mod init gproject
go: creating new go.mod: module gproject
在该目录中创建一个main.go
文件:
package main // 声明 main 包,表明当前是一个可执行程序
import "fmt" // 导入内置 fmt 包
func main(){ // main函数,是程序执行的入口
fmt.Println("Hello World!") // 在终端打印 Hello World!
}
执行或编译后执行:
# 直接run
$ go run main.go
# 编译成二进制文件
$ go build
# 执行二进制文件
goland使用go mod模式
第一步:创建空文件夹
第二步:goland以项目方式打开文件夹
第三步:设置goland中的配置,gopath,goroot,gomodule
第四步:执行go mod init + 项目名,这个截图的地方多一个go modules,用于存放下载的包的
第五步:创建.go文件,然后写上代码
第六步:执行go mod tidy,下载所需的包,也会删除多余的包
在执行命令go mod tidy
时,Go module 会自动整理go.mod 文件
go.mod的内容:
项目名
go 的版本
第三方的包
注意开启go mod 模式后 go get 下载的包都在 go/pkg 目录下
将自动下载依赖包并解压,go get 总是获取最新版本的包
如果包的版本更新了,go get 命令将自动修改go.mod文件
go.sum 该文件记录了所依赖包的hash值,确保依赖包没有被篡改
注意:
经go get 修改的go.mod和go.sum都需要提交的代码库,
这样别人获取项目代码并编译时 就会使用项目所要求的以来版本。
本地保存使用包,命令
go mod vendor
执行该命令后,会出现一个vendor文件夹,里面就是你引用的所有包,由此就可以看出,使用mod后,已经不用依赖于原始的gopath,灵活性更高了。
如果使用过程中有包的变动等,可以使用其他命令辅助,比如go mod tidy,整理你的包目录。
go mod 的指令
go.mod文件中通过指令声明module信息,用于控制命令行工具进行版本选择。一共有四个指令可供使用:
module: 声明module名称;
require: 声明依赖以及其版本号;
replace: 替换require中声明的依赖,使用另外的依赖及其版本号;
exclude: 禁用指定的依赖;
go.sum 文件
引入原由:
为了确保一致性构建,Go引入了go.mod文件来标记每个依赖包的版本,在构建过程中go命令会下载go.mod中的依赖包,下载的依赖包会缓存在本地,以便下次构建。
考虑到下载的依赖包有可能是被黑客恶意篡改的,以及缓存在本地的依赖包也有被篡改的可能,单单一个go.mod文件并不能保证一致性构建
为了解决Go module的这一安全隐患,Go开发团队在引入go.mod的同时也引入了go.sum文件,用于记录每个依赖包的哈希值
在构建时,如果本地的依赖包hash值与go.sum文件中记录得不一致,则会拒绝构建。
vscode 配置go环境
VSCodede的安装
推荐VSCode官网下载,下载地址。
安装步骤也是一路next,路径选择根据个人。
VSCode的配置
- 下载Go插件
然后点击右边的Install即可(我的是已经安装过的所以这样显示)
2. 创建一个项目(文件夹)然后打开他(左上角的File -> Open Folder)
3. 然后点击下方的TERMINAL,输入命令go mod init 你的项目名称,执行该命令后,执行的目录下面就会出现一个go.mod文件
4. 新建一个Go文件, VSCode会激活Go插件,提示的工具全部安装就行了
5. 然后继续在TERMINAL中手动执行go文件,输入指令go run 文件名
go run main.go
一些踩坑经验
当你开启了GO111MODULE
,仍然使用GOPATH模式的方法,在引入自定义模块时会报错。
GO111MODULE 有三个值:off, on和auto(默认值)。
-
GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
-
GO111MODULE=on,go命令行会使用modules,而一点也不会去GOPATH目录下查找。
-
GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:
-
当前目录在GOPATH/src之外且该目录包含go.mod文件
-
当前文件在包含go.mod文件的目录下面。
-
当modules 功能启用时,依赖包的存放位置变更为$GOPATH/pkg,允许同一个package多个版本并存,且多个项目可以共享缓存的 module。
(1)使用了相对路径:import "./models"
报错:build command-line-arguments: cannot find module for path /D/dev这里后面一堆本地路径
这是因为在go module下 你源码中 impot …/ 这样的引入形式不支持了, 应该改成 impot 模块名/ 。 这样就ok了
(2)使用结合了GOPATH的形式:import "Go-Player/src/ademo/models"
于是我们把上面的import改成了结合GOPATH的如上形式
- 报错:package Go-Player/src/ademo/models is not in GOROOT D:/development/go/src/GPlayer/src/ademo/models
(3)彻底解决方法:用go env -u 恢复初始设置
不再使用go mod:
- go env -w GO111MODULE=off 或者 go env -w GO111MODULE=auto
- go env -u GO111MODULE
区别在于,如果GO111MODULE=on或者auto,在go get下载包时候,会下载到GOPATH/pkg/mod,引入时也是同样的从这个目录开始。如果这行了上述命令,那么在go get下载包时候,会下载到GOPATH/src 目录下。
go install
go install
表示安装的意思,它先编译源代码得到可执行文件,然后将可执行文件移动到GOPATH
的bin目录下。因为我们的环境变量中配置了GOPATH
下的bin目录,所以我们就可以在任意地方直接执行可执行文件了。
跨平台编译
默认我们go build
的可执行文件都是当前操作系统可执行的文件,如果我想在windows下编译一个linux下可执行文件,那需要怎么做呢?
只需要指定目标操作系统的平台和处理器架构即可:
SET CGO_ENABLED=0 // 禁用CGO
SET GOOS=linux // 目标平台是linux
SET GOARCH=amd64 // 目标处理器架构是amd64
使用了cgo的代码是不支持跨平台编译的
然后再执行go build
命令,得到的就是能够在Linux平台运行的可执行文件了。
Mac 下编译 Linux 和 Windows平台 64位 可执行程序:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
Linux 下编译 Mac 和 Windows 平台64位可执行程序:
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
Windows下编译Mac平台64位可执行程序:
SET CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build
问题:
1、$GOPATH/go.mod exists but should not
开启模块支持后,并不能与GOPATH
共存,所以把项目从GOPATH
中移出即可
2、解决go 生成的exe不在bin文件夹里的问题
解决
控制台执行go install
补充:go install之后没有生成bin目录的原因(环境变量GOBIN)
运行go install HelloWorld,没有报错,但工作空间里也没有生成bin目录。
想起刚才重新配置环境变量时,把GOBIN也给配置了:/usr/local/go/bin。
所以导致install生成的bin并没在当前工作空间生成对应打bin目录,而是把文件直接生成到里/usr/local/go/bin里。
把GOBIN重新置为了默认的空,source之后并没成功。
因为用的LiteIDE,它打环境变量没有更新过来,重启LiteIDE也没好使。
最后把系统注销重新登录了一下好使了