小菜鸡学程序!来说说 Golang 的环境变数吧!

之前有跟大家提过环境变数,其实可以想像成像是冷气机的各种设定,像是温度、功能、风向、风量等等,让冷气机运行的时候可以根据这些设定达到我们想要的样子,那麽 Golang 也有些可供我们设定的环境变数,今天就来介绍一些比较常用到的几个吧!

以下分别会介绍 GOROOTGOENVGOPATH 以及 GOOSGOARCH


首先,如果你想知道 Golang 的环境变数有哪些,你可以在你的终端机或是 iTerm2 里输入指令 go help environment,画面上会列出 Golang 的环境变数,以及每一个变数的用途说明。

大家可以试着自己在终端机下指令後来查看哦!


如果你想知道你目前 Golang 的环境变数的值,你可以使用指令 go env 来列出环境变数目前设定的值是什麽,画面如下:

如果只是想查看其中某几个环境变数,那麽可以使用指令 go env KEY1 KEY2 ...,例如:go env GOPATH GOENV,输出如下:

想要设定某一个环境变数,那麽你可以使用指令 go env -w KEY=VALUE,例如我如果想把 GOPATH 设定到家目录底下的 go 资料夹,那麽指令就会是 go env -w GOPATH=$HOME/go

但要注意,其中的 GOENV 是不能用 go env -w GOENV=VALUE 来设定的,必须要用指令 export GOENV=VALUE 的方式来设定喔!

接下来就来分别针对其中几个来做说明吧。


首先来讲讲 GOROOT, 这个环境变数在我们一开始下载安装好 Golang 之後,就会有个初始设定了,这其实是当初安装 Golang 的路径喔,在这个路径底下有内建的标准函式库、还有执行档如 gogofmt 等等,所以如果没有其他特殊状况,基本上是不需要自己另外再去设定这个环境变数的哦。

像我的话,一开始预设就是将 Golang 安装在路径 /usr/local/go 底下,因此刚刚的图里,显示出来的 GOROOT 的值就自动设定为 /usr/local/go 罗。


第二个是 GOENV,这个变数他所要储存的是一个档案的路径,也就是如果你想要在一个档案里面去设定各种 Golang 的环境变数的话,那麽就要把那个档案存放的位置设定给 GOENV,要注意的是,那些你在档案中有设定的环境变数,他是会压过预设的值,还有使用指令 go env -w KEY=VALUE 来设定过的那些环境变数,如果在档案中有设定的话也是会以档案中的为主喔。

举个例子,我在家目录底下建立了一个档案 test.env,里面的内容设定了 GOOS 以及 GOARCH,内容如下:

GOOS=windows
GOARCH=amd64

而原本的 GOOSGOARCH 的值分别为:

现在我们使用指令 export GOENV=$HOME/test.env 来将我们刚刚写好的 test.env 设定给 GOENV,接着再来看看设定完之後 GOOSGOARCH 的值是什麽吧,结果如下:

可以看到这两个环境变数的值,都以我们档案里设定的为主罗!


再来要来介绍 GOPATH,这个环境变数在我们开发时可是非常重要的哦!他有点像是告诉 Golang 你的工作区域(Workspace)的感觉,一开始安装好 Golang 之後,这个环境变数预设的值会是家目录底下的 go/ ,也就是 $HOME/go,以我自己为例,就是 /Users/chrishuang/go

一开始虽然安装好後会把 GOPATH 设为这个路径,但如果这个路径并不存在,是不会自动帮忙建立的,因此大家也可以思考看看,想要把哪里当作你 Golang 的工作区域,然後用 go env -w GOPATH=VALUE 来设定喔,如果想直接以预设的路径当作工作目录,那也要记得在家目录底下创建资料夹 go 喔。

一般来说,在这个路径底下,我们还需要手动建立三个资料夹,分别是 binpkgsrc,他们是有不同用处的。

  1. bin:bin 是 binary 的意思,存放可执行档的地方,像是我们使用指令 go install,而且在当前的路径底下有 package main 的话(有func main()、也就是具有程序进入点),则会编译出一个可以执行的档案,这个档案就会放在 GOPATH 底下的 bin/ 之中喔。

  2. pkg:pkg 则是 package,如果我们使用 Go Module 来管理专案中使用的套件,他就会将下载下来的套件依照 网域/作者/专案名 来摆放下载的套件,例如:github.com/joho/godotenv 将会摆放在路径 $GOPATH/pkg/github.com/joho/godotenv 底下。

    另外当我们使用指令 go install 时,如果当前路径底下没有 package main,则不会产生可执行档在 bin/ 底下,反而是会有副档名 .a 的档案产生在 pkg 里面,而这样产出的套件跟我们从 github 上下载下来的套件是一样用法的来做使用哦,而详细如何自己写套件来做使用,以後会努力写出更详细的文章跟大家分享。

  3. src:src 其实就是 source code 的意思,主要是用来存放我们所开发的程序码,可以再依照不同专案等等的分类方式,在这个资料夹内去摆放自己的程序码档案。

关於 GOPATH 的架构、如何编译套件、如何将自己的程序编译成可执行档等等的说明,可以参考官方的说明文章,有更为详细的说明及范例哦!
-> 请点这里


最後 GOOS 以及 GOARCH 放在同一个区块一起说明他们的用处,这两个环境变数的功能是用来告诉 Golang 要将你的程序编译成什麽系统、什麽指令集架构看得懂的执行档,Golang 提供我们可以透过设定这两个环境变数,就可以让编译出来的执行档在不同的平台上执行哦!

但是 GOOSGOARCH 的搭配并不是随便我们填写的,只有有被表列出来的组合才能使用,可以的组合可以参考底下的连结中,主题 Optional environment variables 底下的 $GOOS and $GOARCH 部分。
-> Optional environment variables

举个例子,我先写了一支简单的 Hello World! 程序,内容如下:

package main

import "fmt"

func main() {
    fmt.Println("Hello World!")
}

接着先以 GOOS 设定为 darwinGOARCH 设定为 amd64 的组合来编译出执行档,这是我使用的 Mac 电脑作业系统及指令集架构,使用指令 go build 之後,产生出名为 helloworld 的执行档,此时我们在终端机里执行是毫无问题的。

如果我把产生的这个档案,试着在 Windows 的作业系统底下去执行,他是完全没办法执行的。

此时如果我在使用指令编译出执行档之前,先将环境变数设定成 GOOSwindowsGOARCHamd64 的话,则这次编译出来的执行档 helloworld.exe 在我的 Mac 电脑上就无法执行了。

但相对的,这次产生的档案在我作业系统是 Windows 的电脑里,就可以很正常的执行哦。
但要提醒一下,因为程序跑完之後,开启的视窗会立刻关掉,你可以用 Windows 内建的 CMD 或 PowerShell 来执行刚刚的 helloworld.exe,或是我们可以在刚刚的 Hello World! 程序里面加上最後会等待使用者按下 Enter 才结束程序的程序码,程序修改如下:

package main

import "fmt"

func main() {
    fmt.Println("Hello World!")

    fmt.Print("Press ENTER to leave!")
    fmt.Scanln()
}

修改後的程序码,在 Windows 底下,就算直接滑鼠点击两次执行,还是可以看到输出的结果罗,不会再一闪而过了,我们的输出结果就会在传说中的小黑窗里出现啦!

所以我们就算是使用跟目标作业系统或指令集架构不一样的环境下开发,也可以很轻松透过设定 GOOS 还有 GOARCH 来编译出跨平台的执行档喔。

但是要注意一点,当我们把这两个环境变数设定成跟开发的环境不同,那麽我在开发环境下使用 go run main.go 指令要去执行程序时,也会出现不能执行的问题。

所以当我们只是要改变编译出执行档的目标作业系统集指令集时,可以不要直接修改 Golang 的环境变数,而是使用一个暂时性的设定,只让当下的 go build 指令知道要更改成什麽值就好,因此我们指令修改成 GOOS=VALUE GOARCH=VALUE go build,例如:要编译出作业系统为 Windows、指令集架构为 amd64 的执行档,指令要用 GOOS=windows GOARCH=amd64 go build

如图:我的 Golang 环境变数将 GOOS 设定成 Mac 电脑的 darwin 系统,但是透过上述的 GOOS=windows GOARCH=amd64 go build 指令,还是成功的编译出了在 Windows 底下可以使用的 helloworld.exe 执行档罗!


以上是今天分享的内容,如果内容有误或是有什麽心得想与我讨论,都欢迎在底下留言哦!
谢谢大家!


<<:  [PHP][Laravel][Blade]利用asset()设定JS及CSS来源档案却无法使用?先看看...

>>:  [PHP][Laravel][Blade]如果想要在画面中,限制显示字数,该怎麽做呢?

系统分析师养成之路-当责Accountability

因私人因素欧吉桑有一段时间没发文了,不知道有没有人期待我的新文章呢? 今天,我想跟大家分享的主题是【...

7款初学者必知的室内设计软件

现在,很多人都会选择自己装修房子。有人就在问,室内设计软件有哪些?室内设计软件是一类通过Flash模...

[day-7] 在正式开始写程序之前,先来认识电脑本身吧!(Part .2)

前情提要 昨天 [day-6] 大致介绍了,电脑的起源与相关发展史,相信各位读资讯或是商业领域的人应...

21. React简易实作_购物车清单( 将下层State提升给上层元件 )

今天要解释的是: 如何将下层State提升给上层元件。 但如果没有举例真的太抽象了,所以就乾脆做个功...

关於除错这件事

发达的工具会剥夺人的能力,能力被剥夺後经验会开始狭隘,狭隘的经验则会让思维开始产生死角,有死角的思维...