常用命令
//查看go环境变量路径
which go
//查看go语言环境信息
go env
//查看go版本,查看是否安装成功
go version
GOROOT
环境变量GOROOT
表示Go语言的安装目录。
在Windows
中,GOROOT
的默认值是C:/go
,而在Mac OS
或Linux
中GOROOT
的默认值是usr/local/go
,如果将Go安装在其他目录中,而需要将GOROOT的值修改为对应的目录。
另外,GOROOT/bin
则包含Go为我们提供的工具链,因此,应该将GOROOT/bin
配置到环境变量PATH中,方便我们在全局中使用Go工具链。
GOMODULE
在 go1.11 的时候推出了这个 go modules 来解决依赖管理的问题,类似于PHP的composer
、Nodejs的npm
。Go1.12 成为默认支持; 从此告别源码必须放在 Gopath 中 以及 Gopath 对初学者造成的困扰。通过变量 GO111MODULE 来控制 Go Module 的开启和关闭,取值 off、on 或 auto。从 Go 1.13 开始,Go Module 作为 Golang 中的标准包管理器。Go modules 的出现也解决了在 Go1.11 前的几个常见争议问题:
- Go 语言长久以来的依赖管理问题。
- “淘汰”现有的 GOPATH 的使用模式。
- 统一社区中的其它的依赖管理工具(提供迁移功能)
在 Go modules 中,我们能够使用如下命令进行操作:
关于go.mod
go.mod是Go项目的依赖描述文件,该文件主要用来描述两个事情:
- 当前项目名(module)是什么。每个项目都应该设置一个名称,当前项目中的包(package)可以使用该名称进行相互调用。
- 当前项目依赖的第三方包名称。项目运行时会自动分析项目中的代码依赖,生成go.sum依赖分析结果,随后go编译器会去下载这些第三方包,然后再编译运行。
我们只需设置该环境变量即可正常下载被墙的源码包了。在项目目录 或者 项目子模块下,运行下面命令,会产生一个go.mod文件
go mod init
我们将之前的项目根目录增加一个go.mod
文件(也可以在项目根目录下使用 go mod init 项目名称
命令初始化项目生成该文件),内容如下
module my-hello
其中,my-hello
为当前项目的名称,可以随意设置。就这样简单便完成了项目的module
初始化。
一般情况下,go.sum
依赖分析文件应当被添加到版本管理中随着go.mod
文件一起提交。
使用go.mod
使用go.mod意即用go.mod进行项目依赖管理。我们有两种go.mod的使用方式:IDE-vgo和命令行方式。
vgo
是基于Go Module
规范的包管理工具,同官方的go mod
命令工具类似。
设置Goland启用vgo
其中Proxy
请输入代理地址下载依赖包,如果选择direct
表示不使用代理。可选择的反向代理地址有:Project SDK=https://mirrors.aliyun.com/goproxy/
https://goproxy.cn
https://goproxy.io
Project SDK=https://mirrors.aliyun.com/goproxy/
这里请务必选择一个代理地址输入。
GOPROXY
这个环境变量主要是用于设置 Go 模块代理(Go module proxy),其作用是用于使 Go 在后续拉取模块版本时能够脱离传统的 VCS 方式,直接通过镜像站点来快速拉取。
GOPROXY 的默认值是:https://proxy.golang.org,direct
,这有一个很严重的问题,就是 proxy.golang.org
在国内是无法访问的。你必须在开启 Go modules 的时,同时设置国内的 Go 模块代理,执行如下命令
# Enable the go modules feature
export GO111MODULE=on
# Set the GOPROXY environment variable
export GOPROXY=https://goproxy.cn
go env -w GO111MODULE=on
# 同时将代理进行替换
go env -w GOPROXY=https://goproxy.cn,direct
GONOPROXY/GONOSUMDB/GOPRIVATE
这三个环境变量都是用在当前项目依赖了私有模块,例如像是你公司的私有 git 仓库,又或是 github 中的私有库,都是属于私有模块,都是要进行设置的,否则会拉取失败。
go env -w GOPRIVATE="*.example.com"
这样子设置的话,所有模块路径为 example.com 的子域名(例如:git.example.com)都将不经过 Go module proxy 和 Go checksum database,需要注意的是不包括 example.com 本身
GOBIN
环境变量GOBIN
表示我们开发程序编译后二进制命令的安装目录。
当我们使用go install
命令编译和打包应用程序时,该命令会将编译后二进制程序打包GOBIN目录,一般我们将GOBIN设置为GOPATH/bin
目录。
GOPATH
1、GOPATH
是用于指定你的workspace
的环境变量,它内部目录一般为:
$HOME/go
--bin # 存放编译后的可执行文件
--pkg # 依赖包编译后的*.a文件
--src # 项目源代码的存放路径
2、1.8 版本以后,GO默认给你设置一个$GOPATH=$HOME/go
,可自定义。
3、我们可以指定不同的workspace
(不同的开发项目):
vim /etc/profile
export GOROOT=/usr/local/go #设置为go安装的路径,有些安装包会自动设置默认的goroot
export GOPATH=$HOME/goproj01:$HOME/goproj02 #默认安装包的路径
export GOBIN=$HOME/gobin #Go程序的可执行文件的目录
export PATH=$PATH:$GOROOT/bin:$GOPATH:$GOBIN
source /etc/profile
4、对于第三方依赖包,GO会默认安装在GOPATH
环境变量的第一个workspace
的src
里面,也就是:$HOME/goproj01
5、我们在项目中引入包的时候,默认先从$GOPATH/src
中去找。
# 项目目录是:
$HOME/go
--bin
--pkg
--src
-- main
-- pkg1
-- say.go
-- hello_world.go
# hello_world.go
package main
import (
V "main/pkg1" // 给包起一个别名
)
func main() {
V.SayHello()
}
6、项目写完后,我们进入$GOPATH/src
(main.go在这个目录下<也可以在更深一层的目录,视自己情况而定>),执行:
$ go install
go install/go get和 go的工具等会用到GOPATH环境变量。此时会在 :
- pkg 中生成所有的依赖包的编译文件:
*.a
- bin 中生成
main.go
的编译文件:main
7、配置 .gitignore 文件时,忽略 pkg、bin 目录
# .gitignore
pkg/*
bin/*
为什么弃用 GOPATH 模式
在 GOPATH 的 $GOPATH/src
下进行 .go
文件或源代码的存储,我们可以称其为 GOPATH 的模式,这个模式,看起来好像没有什么问题,那么为什么我们要弃用呢,参见如下原因:
- GOPATH 模式下没有版本控制的概念,具有致命的缺陷,至少会造成以下问题:
- 在执行
go get
的时候,你无法传达任何的版本信息的期望,也就是说你也无法知道自己当前更新的是哪一个版本,也无法通过指定来拉取自己所期望的具体版本。 - 在运行 Go 应用程序的时候,你无法保证其它人与你所期望依赖的第三方库是相同的版本,也就是说在项目依赖库的管理上,你无法保证所有人的依赖版本都一致。
- 你没办法处理 v1、v2、v3 等等不同版本的引用问题,因为 GOPATH 模式下的导入路径都是一样的,都是
github.com/foo/bar
。
- Go 语言官方从 Go1.11 起开始推进 Go modules(前身vgo),Go1.13 起不再推荐使用 GOPATH 的使用模式,Go modules 也渐趋稳定,因此新项目也没有必要继续使用GOPATH模式。
切换国内Go源
#查看配置
go env
#修改配置
go env -w GOPROXY=https://goproxy.cn
国内提供的sum验证服务
go env -w GOSUMDB=sum.golang.google.cn
程序操作环境变量
package main
import (
"fmt"
"os"
"strings"
)
func main() {
err := os.Setenv("ENV_NAME", "dev") //临时设置 系统环境变量
if err != nil {
fmt.Println(err.Error())
}
env := os.Getenv("Project SDK")
fmt.Printf(env)
for _, v := range os.Environ() { //获取全部系统环境变量 获取的是[]string
str := strings.Split(v, "=")
fmt.Printf("%s = %s \n", str[0], str[1])
}
}
Go调用包报错
build command-line-arguments: cannot find module for path
方法1:如果之前Go环境安装是直接下载msi文件
- 1、打开shell命令窗:ctrl+r , 输入 cmd,
- 2、输入go env -w GO111MODULE=auto,这句是将GO111MODULE设为自动。
- 3、再次测试,问题解决
方法2:如果是自己设置的环境变量
- 1、右键计算机,点击属性,打开高级系统设置,点击环境变量,找到GO111MODULE,编辑GO111MODULE,将on改为auto或者off。
- 2、再次测试,问题解决
Failed to run File Watcher 'go fmt'.
The watcher has been disabled.
Error: Invalid executable
sudo chmod -R 777 /usr/local/go