常用命令

//查看go环境变量路径
which go
//查看go语言环境信息
go env
//查看go版本,查看是否安装成功
go version

GOROOT

环境变量GOROOT表示Go语言的安装目录。

Windows中,GOROOT的默认值是C:/go,而在Mac OSLinuxGOROOT的默认值是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 前的几个常见争议问题:

  1. Go 语言长久以来的依赖管理问题。
  2. “淘汰”现有的 GOPATH 的使用模式。
  3. 统一社区中的其它的依赖管理工具(提供迁移功能)

在 Go modules 中,我们能够使用如下命令进行操作:

HarmonyOS 读取环境变量_HarmonyOS 读取环境变量

关于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

HarmonyOS 读取环境变量_环境变量_02

其中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环境变量的第一个workspacesrc里面,也就是:$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