极客时间已完结课程限时免费阅读

03|配好环境:选择一种最适合你的Go安装方法

03|配好环境:选择一种最适合你的Go安装方法-极客时间

03|配好环境:选择一种最适合你的Go安装方法

讲述:Tony Bai

时长17:21大小15.86M

你好,我是 Tony Bai。
经过上一节的对 Go 设计哲学的探讨后,如果你依然决定继续 Go 语言编程学习之旅,那么欢迎你和我一起正式走进 Go 语言学习和实践的课堂。
编程不是“纸上谈兵”,它是一门实践的艺术。编程语言的学习离不开动手实践,因此学习任何一门编程语言的第一步都是要拥有一个这门编程语言的开发环境,这样我们才可以动手编码,理论与实践结合,不仅加速学习效率,还能取得更好的学习效果。
在这一讲中我们就先来学习下如何安装和配置 Go 语言开发环境。如果你的机器上还没有 Go,那么就请跟我一起选择一种适合你的 Go 安装方法吧。第一步,先来挑一个合适的 Go 版本。

选择 Go 版本

挑版本之前,我们先来看看 Go 语言的版本发布策略
如今,Go 团队已经将版本发布节奏稳定在每年发布两次大版本上,一般是在二月份和八月份发布。Go 团队承诺对最新的两个 Go 稳定大版本提供支持,比如目前最新的大版本是 Go 1.17,那么 Go 团队就会为 Go 1.17 和 Go 1.16 版本提供支持。如果 Go 1.18 版本发布,那支持的版本将变成 Go 1.18 和 Go 1.17。支持的范围主要包括修复版本中存在的重大问题、文档变更以及安全问题更新等。
基于这样的版本发布策略,在你选择版本时可以参考这几种思路:
一般情况下,我建议你采用最新版本。因为 Go 团队发布的 Go 语言稳定版本的平均质量一直是很高的,少有影响使用的重大 bug。你也不用太担心新版本的支持问题,Google 的自有产品,比如 Google App Engine(以下简称为 GAE)支持都会很快,一般在 Go 新版本发布不久后,GAE 便会宣布支持最新版本的 Go。
你还可以根据不同实际项目需要或开源社区的情况使用不同的版本。
有的开源项目采纳了 Go 团队的建议,在 Go 最新版本发布不久就将当前项目的 Go 编译器版本升级到最新版,比如 Kubernetes 项目;而有的开源项目(比如:docker 项目)则比较谨慎,在 Go 团队发布 Go 1.17 版本之后,这些项目可能还在使用两个发布周期之前的版本,比如 Go 1.15。
但多数项目处于两者之间,也就是使用次新版,即最新版本之前的那个版本。比如,当前最新版本为 Go 1.17,那么这些项目会使用 Go 1.16 版本的最新补丁版本(Go 1.16.x),直到发布 Go 1.18 后,这些项目才会切换到 Go 1.17 的最新补丁版本(Go 1.17.x)。如果你不是那么“激进”,也可以采用这种版本选择策略。
因为我们这门课是 Go 语言学习的课,所以我这里建议你直接使用 Go 最新发布版,这样我们可以体验到 Go 的最新语言特性,应用到标准库的最新 API 以及 Go 工具链的最新功能。在这一节课里我们以 Go 1.16.5 版本为例讲述一下其安装、配置和使用方法。
选定 Go 版本后,接下来我们就来看看几种常见的 Go 安装方法。

安装 Go

Go 从 2009 年开源并演化到今天,它的安装方法其实都已经很成熟了,接下来呢,我们就逐一介绍在 Linux、macOS、Windows 这三大主流操作系统上安装 Go 的方法,我们假设这些操作系统都安装在 X86-64 的平台上,首先我们来看 Linux。

在 Linux 上安装 Go

Go 几乎支持 Linux 所有的主流发行版操作系统,常见的包括 Ubuntu、CentOS(Redhat 企业版 Linux 的社区开源版)、Fedora、SUSE 等等,Go 在这些主流的 Linux 发行版操作系统上的安装方法都是一样的(当然某个发行版也可能会利用其软件安装管理器提供仅属于其自己的安装方法)。你可以参考下面这样的安装步骤。
首先,我们需要下载并解压 Go Linux 安装包:
$wget -c https://golang.google.cn/dl/go1.16.5.linux-amd64.tar.gz
这里有个小提醒:虽然 Go 官方下载站点是 golang.org/dl,但我们可以用针对中国大陆的镜像站点 golang.google.cn/dl 来下载,在中国大陆地区使用大陆镜像站点可以大幅缩短下载时间。
第二步,将下载完毕的 Go 安装包解压到安装目录中:
$tar -C /usr/local -xzf go1.16.5.linux-amd64.tar.gz
执行完上面解压缩命令后,我们将在 /usr/local 下面看到名为 go 的目录,这个目录就是 Go 的安装目录,也是 Go 官方推荐的 Go 安装目录。我们执行下面命令可以查看该安装目录下的组成:
$ls -F /usr/local/go
AUTHORS CONTRIBUTORS PATENTS SECURITY.md api/ doc/ lib/ pkg/ src/
CONTRIBUTING.md LICENSE README.md VERSION bin/ favicon.ico misc/ robots.txt test/
不过呢,为了可以在任意路径下使用 go 命令,我们需要将 Go 二进制文件所在路径加入到用户环境变量 PATH 中(以用户使用 bash 为例),具体操作是将下面这行环境变量设置语句添加到 $HOME/.profile 文件的末尾:
export PATH=$PATH:/usr/local/go/bin
然后执行下面命令使上述环境变量的设置立即生效:
$source ~/.profile
最后,我们可以通过下面命令验证此次安装是否成功:
$go version
如果这个命令输出了“go version go1.16.5 linux/amd64”,那么说明我们这次的 Go 安装是成功的。

在 Mac 上安装 Go

在 Mac 上我们可以在图形界面的引导下进行 Go 的安装。不过,我们先要下载适用于 Mac 的 Go 安装包:
$wget -c https://golang.google.cn/dl/go1.16.5.darwin-amd64.pkg
安装包下载完毕后,我们可以双击安装包,打开标准的 Mac 软件安装界面,如下图所示:
按软件安装向导提示,一路点击“继续”,我们便可以完成 Go 在 Mac 上的安装。
和 Linux 一样,Mac 上的 Go 安装包默认也会将 Go 安装到 /usr/local/go 路径下面。因此,如果要在任意路径下使用 Go,我们也需将这个路径加入到用户的环境变量 PATH 中。具体操作方法与上面 Linux 中的步骤一样,也是将下面环境变量设置语句加入到 $HOME/.profile 中,然后执行 source 命令让它生效就可以了:
export PATH=$PATH:/usr/local/go/bin
最后,我们同样可以通过 go version 命令验证一下这次安装是否成功。
当然了,在 Mac 上,我们也可以采用像 Linux 那样的通过命令行安装 Go 的方法,如果采用这种方法,我们就要下载下面的 Mac Go 安装包:
$wget -c https://golang.google.cn/dl/go1.16.5.darwin-amd64.tar.gz
后续的步骤与 Linux 上安装 Go 几乎没有差别,你直接参考我上面讲的就好了。

在 Windows 上安装 Go

在 Windows 上,我们最好的安装方式就是采用图形界面引导下的 Go 安装方法。
我们打开Go 包的下载页面,在页面上找到 Go 1.16.5 版本的 Windows msi 安装包(AMD64 架构下的):go1.16.5.windows-amd64.msi,通过浏览器自带的下载工具它下载到本地任意目录下。
双击打开已下载的 go1.16.5.windows-amd64.msi 文件,我们就能看到下面这个安装引导界面:
和所有使用图形界面方式安装的 Windows 应用程序一样,我们只需一路点击“继续(next)”就可完成 Go 程序的安装了,安装程序默认会把 Go 安装在 C:\Program Files\Go 下面,当然你也可以自己定制你的安装目录。
除了会将 Go 安装到你的系统中之外,Go 安装程序还会自动为你设置好 Go 使用所需的环境变量,包括在用户环境变量中增加 GOPATH,它的值默认为 C:\Users[用户名]\go,在系统变量中也会为 Path 变量增加一个值:C:\Program Files\Go\bin,这样我们就可以在任意路径下使用 Go 了。
安装完成后,我们可以打开Windows的“命令提示符”窗口(也就是CMD命令)来验证一下Go有没有安装成功。在命令行中输入go version,如果看到下面这个输出结果,那证明你这次安装就成功了:
C:\Users\tonybai>go version
go version go1.16.5 windows/amd64
到这里,我们已经把 Go 语言在主流操作系统上的安装讲完了,但这里其实我讲的都是安装一个版本的 Go 的方法,有些时候我们会有安装多个 Go 版本的需求,这点我们接着往下看。

安装多个 Go 版本

一般来说,Go 初学者安装一个最新的 Go 版本就足够了,但随着 Go 编程的深入,我们通常会有使用多个 Go 版本的需求,比如一个版本用于学习或本地开发,另外一个版本用于生产构建等等。
安装多个 Go 版本其实也很简单,这里我给你介绍三种方法。

方法一:重新设置 PATH 环境变量

你只需要将不同版本的 Go 安装在不同路径下,然后将它们的 Go 二进制文件的所在路径加入到 PATH 环境变量中就可以了。
我们以 Linux 环境为例,在前面介绍 Go 标准安装方法的时候,我们已经将 Go 1.16.5 版本安装到了 /usr/local/go 下面,也将 /usr/local/go/bin 这个路径加入到了 PATH 路径下了,当前状态我们在任意路径下敲入 go,执行的都是 Go 1.16.5 版本对应的 Go 二进制文件。
那这个时候,如果我们想再安装一个 Go 1.15.13 版本要怎么办呢?
首先,你需要按照标准步骤将 Go 1.15.13 安装到事先建好的 /usr/local/go1.15.13 路径下:
$mkdir /usr/local/go1.15.13
$wget -c https://golang.google.cn/dl/go1.15.13.linux-amd64.tar.gz
$tar -C /usr/local/go1.15.13 -xzf go1.15.13.linux-amd64.tar.gz
接下来,我们来设置 PATH 环境变量,将原先 $HOME/.profile 中的 PATH 变量的值由:
export PATH=$PATH:/usr/local/go/bin
改为:
export PATH=$PATH:/usr/local/go1.15.13/go/bin
这样通过执行 source 命令重新使 PATH 环境变量生效后,我们再执行 go version 命令,会得到下面这样的结果:
$go version
go version go1.15.13 linux/amd64
这样,我们已经安装好两个 Go 版本了。这之后,我们如果要在 Go 1.16.5 和 Go 1.15.13 两个版本之间切换,只需要重新设置 PATH 环境变量并生效即可。
不过,你可能依然会觉得通过重新设置 PATH 环境变量的方法有些麻烦。没关系,Go 官方也提供了一种在系统中安装多个 Go 版本的方法,下面我们就来看一下第二种方法。

方法二:go get 命令

这种方法有一个前提,那就是当前系统中已经通过标准方法安装过某个版本的 Go 了。
我们还以 Linux 环境为例,假设目前环境中已经存在了采用标准方法安装的 Go 1.16.5 版本,我们接下来想再安装一个 Go 1.15.13 版本。按照 Go 官方方法,我们可以这样来做:
首先,将 $ HOME/go/bin 加入到 PATH 环境变量中并生效,即便这个目录当前不存在也没关系:
export PATH=$PATH:/usr/local/go/bin:~/go/bin
然后,我们要执行下面这个命令安装 Go 1.15.13 版本的下载器:
$go get golang.org/dl/go1.15.13
这个命令会将名为 Go 1.15.13 的可执行文件安装到 $HOME/go/bin 这个目录下,它是 Go 1.15.13 版本的专用下载器,下面我们再来执行 Go 1.15.13 的下载安装命令:
$go1.15.13 download
Downloaded 0.0% ( 16384 / 121120420 bytes) ...
Downloaded 1.8% ( 2129904 / 121120420 bytes) ...
Downloaded 84.9% (102792432 / 121120420 bytes) ...
Downloaded 100.0% (121120420 / 121120420 bytes)
Unpacking /root/sdk/go1.15.13/go1.15.13.linux-amd64.tar.gz ...
Success. You may now run 'go1.15.13'
现在,我们看到这个命令下载了 go1.15.13.linux-amd64.tar.gz 安装包,也将它安装到 $HOME/sdk/go1.15.13 下面了。下载安装结束后,我们就可以利用带有版本号的 go 命令来使用特定版本的 Go 了:
$go1.15.13 version
go version go1.15.13 linux/amd64
同样的,我们也可以通过下面这个命令查看特定 Go 版本的安装位置:
$go1.15.13 env GOROOT
/root/sdk/go1.15.13

方法三:go get 命令安装非稳定版本

其实,除了 Go 团队正式发布的稳定版本 (stable version),像前面安装的 Go 1.16.5 或 Go 1.15.13,我们还可以通过 go get 的方法安装 Go 团队正在开发的非稳定版本 (Unstable Version),包括每个稳定版发布前的 beta 版本或当前最新的 tip 版本,这些非稳定版本可以让 Go 开发人员提前体验到即将加入到稳定版本中的新特性。
但是,通过 go get 安装不同 Go 版本的方法在中国大陆地区会因网络问题而失败。如果你已经克服了网络问题,那安装非稳定版本的步骤其实和上面的步骤一样。现在,我们以 Go 1.17beta1 和 Go Tip 版本为例,带你体验一下它们的安装步骤和验证方法。
首先我们来看 Go 1.17beta1:
$go get golang.org/dl/go1.17beta1
$go1.17beta1 download
Downloaded 0.0% ( 3272 / 134470397 bytes) ...
Downloaded 21.4% ( 28819248 / 134470397 bytes) ...
Downloaded 58.1% ( 78069168 / 134470397 bytes) ...
Downloaded 100.0% (134470397 / 134470397 bytes)
Unpacking /root/sdk/go1.17beta1/go1.17beta1.linux-amd64.tar.gz ...
Success. You may now run 'go1.17beta1'
$go1.17beta1 version
go version go1.17beta1 linux/amd64
接着来看 Go Tip 版本:
$go get golang.org/dl/gotip
$gotip download
go get 为我们安装 tip 版本提供了极大方便,要知道在以前,如果我们要安装 tip 版本,需要手工下载 Go 源码并自行编译。但你要注意的是:不是每次 gotip 安装都会成功,因为这毕竟是正在积极开发的版本,一次代码的提交就可能会导致 gotip 版本构建失败!
安装好 Go 之后,我们就该讲讲怎么配置了。

配置 Go

其实 Go 在安装后是开箱即用的,这也意味着我们在使用 Go 之前无需做任何配置。但为了更好地了解和学习 Go,我们还是要认识一些 Go 自带的常用配置项。Go 的配置项是以环境变量的形式存在的,我们可以通过下面这个命令查看 Go 的这些配置项:
$go env
这里我也给你总结了一些常用配置项:
如果你还要了解更多关于 Go 配置项的说明,你可以通过 go help environment 命令查看。

小结

好了,到这里我们的 Go 安装配置方法就讲解完毕了,选好你要使用的 Go 安装方法了吗?
在这一节课中我们首先讲解了三种 Go 版本的选择策略:
第一种,也是我们推荐的一种,那就是使用 Go 最新的版本,这样你可以体验到 Go 的最新语言特性,应用到标准库的最新 API 以及 Go 工具链的最新功能,并且很多老版本中的 bug 在最新版本中都会得到及时修复;
如果你还是对最新版本的稳定性有一丝担忧,你也可以选择使用次新版;
最后,如果你要考虑现存生产项目或开源项目,那你按照需要选择,与项目策略保持一致就好了。
确定完 Go 版本后,我们就可以来安装这个 Go 版本了。这一节课我们也详细介绍了在三个主流操作系统上安装 Go 稳定版本的方法。
对于使用 Windows 或 macOS 操作系统的开发者,使用基于图形界面的安装方式显然是最方便、最简洁的;对于使用 Linux 操作系统的开发者,使用自解压的安装包,或者是通过操作系统自带安装工具来进行 Go 安装比较普遍。
如果你是要在本地开发环境安装多个 Go 版本,或者是要抢先体验新版 Go,我们还讲解了两种在本地安装多个 Go 版本的方法。这里再强调一下,通过 go get 方式安装最新的 Go tip 版本存在失败的可能性哦!
最后,我们讲解了 Go 的一些常用配置项的功用,对于中国地区的 Go 开发者而言,你在真正使用 Go 构建应用之前,唯一要做的就是配置 GOPROXY 这个 Go 环境变量。
有了 Go 开发环境,我们就有了编写和构建 Go 代码的基础,在下一讲中我们就将开始学习如何编写 Go 代码。

思考题

今天的课后思考题,我想请你在安装好的 Go 开发环境中,使用 go help 命令查看和总结一下 Go 命令的使用方法。
感谢你和我一起学习,也欢迎你把这节课分享给更多对 Go 语言学习感兴趣的朋友。我是 Tony Bai,我们下节课见。
分享给需要的人,Ta购买本课程,你将得18
生成海报并分享

赞 61

提建议

上一篇
02|拒绝“Hello and Bye”:Go语言的设计哲学是怎么一回事?
下一篇
04|初窥门径:一个Go程序的结构是怎样的?
unpreview
 写留言

精选留言(36)

  • 薛定谔猫的小确幸💯
    2021-10-20
    备注:GOPROXY由于国内的网络环境,我们可以通过配置GOPROXY避免DNS污染导致的模块拉取缓慢或失败的问题,加速你的构建。 windows cmd下: go env -w GOPROXY=https://goproxy.cn,direct
    共 2 条评论
    38
  • 陈彬
    2021-10-18
    Tony老师 $go get golang.org/dl/go1.15.13 这个是不是已经不能用了,改成了: $go install golang.org/dl/go1.15.13@latest

    作者回复: 是的。如果用的是go 1.17版本,那么从go 1.17开始, go get不再承载go install功能了。写这篇稿子的时候,go 1.17还没有发布。用的是go 1.16。

    共 3 条评论
    18
  • Geek_eb6c14
    2021-10-18
    Mac环境下更改GOPROXY环境变量的终端命令行: export GOPROXY="https://goproxy.cn,direct"

    作者回复: 手动点赞!

    共 2 条评论
    9
  • lesserror
    2021-10-18
    感觉Tony Bai老师的细致分享。 比较困惑我的地方是:安装多个 Go 版本的方法二和方法三。 文中说:“这个命令会将名为 go1.15.13 的可执行文件安装到 $HOME/go/bin 这个目录下”。我在Mac下,期初是没有这个文件夹的,文中说没有也没关系,我以为会自动创建。但是最终没有创建这个文件夹,也没看到可执行的安装文件。最后依然可以安装成功对应的Go版本。 关于这块,能讲讲原理就好了,看了文章,我似乎还并不明白。 文中说:“不是每次 gotip 安装都会成功,因为这毕竟是正在积极开发的版本,一次代码的提交就可能会导致 gotip 版本构建失败!” 我这里访问外网没问题,依然尝试了很多次,都是失败(fatal: unable to access 'https://go.googlesource.com/go/': Failed to connect to go.googlesource.com port 443: Operation timed out gotip: failed to clone git repository: exit status 128)。 “一次代码的提交就可能会导致 gotip 版本构建失败!” 能说说这里表达的意思吗?不是很懂。 另外,关于Go的配置的各种环境变量设置,希望后文能够结合各种go命令而产生的结果,是由哪些环境Go配置环境变量影响的,Go项目的构建,这些配置都是怎么搭配使用的,能够结合实例讲讲。我看了很多入门课程,都只是在教程开头列了这一个配置表格,后文再无提及。这样还是不能上手Go项目的开发。
    展开

    作者回复: 首先感谢你如此认真的看文章、动手实践以及提出问题。 问题1:当你的主机上没有$HOME/go/bin目录时,当执行go get/install 1.15.13版本时,go命令会自动创建$HOME/go/bin目录,并将下载的go1.15.13文件放置在该目录下。 问题2:“fatal: unable to access 'https://go.googlesource.com/go/': Failed to connect to go.googlesource.com port 443: Operation timed out gotip: failed to clone git repository: exit status 128” -- 这个问题还是与网络或git clone慢导致超时油管。 至于““一次代码的提交就可能会导致 gotip 版本构建失败!”,这个很容易理解啊。当我们通过go get方式安装go-tip版本时,go get其实也是下载go tip最新源码,然后编译这份源码。如果某个go核心开发者提交一个代码恰好导致go tip源码编译不过去,而你 下载的恰恰是这个时刻的go tip源码,那你的go tip安装自然就会因build失败而失败。 最后,你的建议很好。我会注意考虑的。

    共 3 条评论
    6
  • 郑童文
    2021-10-21
    请问老师go env 里面的配置项究竟是存储在哪儿的? 网上有说是生成go 命令(go语言的的编译工具)时,直接包含在其中了,也有说是在一个和用户相关的配置文件夹里面,还有的说是来自系统环境变量,那这三种来源的优先级是怎么样的? 谢谢!

    作者回复: 好问题。go env的确会综合多个数据源。优先级最高的是用户级环境变量。以linux为例,你的用户下的.profile文件中的环境变量优先级最高。然后是系统级环境变量(但我们很少在linux下用系统级环境变量),最后是go自带的默认值。

    4
  • 陈东
    2021-10-18
    1、按要求操作,go help 2、总结: go build主要用于编译代码。 go clean移除当前源码包和关联源码包。 3、安装好环境后,不设置PATH,再安装Goland jetbrains,能不能自动关联已安装好的path,谢谢。
    展开

    作者回复: 1. go clean不是移除源码包,而是将之前构建的成果(.a,.o)移除。 2. goland 是否能自动关联,这个不确定。我日常使用vim较多。我觉得你可以打开goland,看看其配置,通过配置查看其关联的路径是否正确。

    3
  • 宝仔
    2021-10-18
    老师多版本管理工具gvm怎么样?可以用于生产环境吗

    作者回复: 知道这个工具,但我没有用过。gvm更多是开发阶段使用的吧。无需部署到生产环境中,所以也谈不上是否可用于生产吧。如果觉得顺手,都可以在开发环境使用。

    3
  • SummerRecord
    2022-05-02
    Windows可以用winget一键安装 winget install GoLang.Go

    作者回复: 👍。这个还真没试过。

    1
  • mikewoo
    2022-04-07
    ## 1 Ubuntu安装GO 1.8 ming@itdest:~$ wget -c https://golang.google.cn/dl/go1.18.linux-amd64.tar.gz ming@itdest:~$ sudo tar -xzvf go1.18.linux-amd64.tar.gz -C /usr/local/ ming@itdest:~$ ls /usr/local/go api bin CONTRIBUTING.md doc LICENSE PATENTS README.md src VERSION AUTHORS codereview.cfg CONTRIBUTORS lib misc pkg SECURITY.md test ## 2 配置环境变量 ming@itdest:~$ sudo vim /etc/profile ``` shell export GOROOT=/usr/local/go export GO111MODULE="on" export GOBIN=$GOROOT/bin export GOPATH=/home/ming/code/go export GOPROXY="https://goproxy.cn,direct" export PATH=$GOROOT/bin:$PATH ``` ming@itdest:~$ . /etc/profile ## 3 验证安装是否成功 ### 3.1 查看go版本信息 ming@itdest:~$ go version go version go1.18 linux/amd64 ### 3.2 查看go env配置 ming@itdest:~$ go env GO111MODULE="on" GOARCH="amd64" GOBIN="/usr/local/go/bin" GOCACHE="/home/ming/.cache/go-build" GOENV="/home/ming/.config/go/env" GOEXE="" GOEXPERIMENT="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="linux" GOINSECURE="" GOMODCACHE="/home/ming/code/go/pkg/mod" GONOPROXY="" GONOSUMDB="" GOOS="linux" GOPATH="/home/ming/code/go" GOPRIVATE="" GOPROXY="https://goproxy.cn,direct" GOROOT="/usr/local/go" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64" GOVCS="" GOVERSION="go1.18" GCCGO="gccgo" GOAMD64="v1" AR="ar" CC="gcc" CXX="g++" CGO_ENABLED="1" GOMOD="/dev/null" GOWORK="" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build2801595155=/tmp/go-build -gno-record-gcc-switches"
    展开

    作者回复: 👍

    共 2 条评论
    1
  • rs勿忘初心
    2021-12-20
    FYI: GOPROXY: 用来配置Go Module proxy服务,其默认值为"https://proxy.golang.org,direct"。中国大陆地区,一般设置为大陆地区提供的module proxy服务以加速Go Module的获取速度,值可以设置为"https://goproxy.cn,direct" Mac更改GOPROXY环境变量的终端命令行为:export GOPROXY="https://goproxy.cn,direct"
    展开

    作者回复: 👍

    1
  • Rock
    2021-11-06
    安装多个版本的方法一通过重新设置 PATH 环境变量的方法有些麻烦,同时只能存在一个版本。借鉴于老师提供的方法二的思路,通过以下别名alias的方式配置即可实现不许更改环境变量就可多版本共存,不知是否有问题,请老师查看: 版本1:go1.16.5按照正常配置go到环境变量 版本2: go1.15.13下载到指定目录,alias go1.5=/usr/local/go1.15.13/go/bin/go 这样命令行输入:go 为默认1.16.5版本 命令行输入:go1.5 为go1.15.13版本
    展开

    作者回复: 这么设置没有问题。但如果你有两个go 1.15版本要用,一个是go1.15.12和go 1.15.13,那么你是不是还是要做两个alias,莫不如直接用go1.15.13和go1.15.12这样的名称。

    1
  • 2021-10-19
    老师问个代码问题 package main import ( "fmt" ) func main() { out := make(chan int) in := make(chan int) // Create 3 `multiplyByTwo` goroutines. go multiplyByTwo(in, out) go multiplyByTwo(in, out) go multiplyByTwo(in, out) // Up till this point, none of the created goroutines actually do // anything, since they are all waiting for the `in` channel to // receive some data, we can send this in another goroutine go func() { in <- 1 in <- 2 in <- 3 in <- 4 }() // Now we wait for each result to come in fmt.Println(<-out) fmt.Println(<-out) fmt.Println(<-out) fmt.Println(<-out) } func multiplyByTwo(in <-chan int, out chan<- int) { fmt.Println("Initializing goroutine...") for { num := <-in result := num * 2 out <- result } } 这个代码执行路径怎么走的。执行结果Initializing goroutine... 输出都数量不等,顺序也不一样。
    展开

    作者回复: 这个程序涉及到5个Goroutine,每次程序运行,go运行时对goroutine的调度情况都是不一样的。我们不能按照一个顺序的思路去分析该程序的执行情况。 在mac上我得到结果如下: Initializing goroutine... 2 Initializing goroutine... Initializing goroutine... 4 6 8 在ubuntu上结果如下: Initializing goroutine... 2 Initializing goroutine... Initializing goroutine... 8 4 6 这与goroutine调度与执行的不确定的分析是一致的。

    共 2 条评论
    1
  • Lee
    2022-10-25 来自北京
    GO111MODULE="off" 神奇 我安装的1.19.2 这个居然是off

    作者回复: 不应该的,确认以前没有设置过? go env看一下 GOENV这个变量,看看这个路径下的文件是否存在,如存在内容是啥。 另外看一下shell环境变化是否设置了GO111MODULE。

    共 3 条评论
  • Geek_JcoLE
    2022-10-04 来自北京
    Mac使用brew下载后直接使用go version验证成功了,但是在网上查阅了很多资料,需要配置环境变量GOPATH和GOROOT,想问老师这种情况下还需要配置环境变量嘛?

    作者回复: 新版go都不需要配置goroot和gopath了。

    1
  • 唐家岭大盗
    2022-09-29 来自北京
    老师您好,如果一台机器安装了多个go版本,这些版本共用一套环境变量吗,还是说每个版本有自己的环境变量啊

    作者回复: 如果是通过系统shell设置的环境变量,那应该是共享的。 如果是通过go env -w设置的,那么要看不同版本go存储env配置的路径是否是一样,如果一样,那也是共享的。查看配置路径的方法:go env GOENV。

    1
  • 码小呆
    2022-08-03 来自北京
    感觉,没必要那么麻烦吧,直接下载一个最新的版本使用,下载一个源码的go供学习就好了

    作者回复: 作为专栏教程,要满足多样性,所以这里提供了多种方法。大家选择一种最适合自己的即可。

  • Demon.Lee
    2022-06-09
    在传统的GOPATH构建模式下,用于指示Go包搜索路径的环境变量,在Gomodule机制启用之前是Go核心配置项。Go1.8版本之前需要手工配置,Go1.8版本引入了默认的GOPATH($HOME/go)。在GoModule 模式正式上位后,很可能会被移除。 ---------------------------- 老师,GoModule 模式下,我看现在下载的第三方依赖包就存放在 GOPATH 指定的目录下,如 GOPATH 将来被移除,应该也要指定一个路径存放这些第三方依赖包吧。
    展开

    作者回复: 嗯,是的,即便GOPATH被移除,go也一定会设置一个默认位置的。比如:$HOME/go/pkg/mod下面。

  • 总有刁民想害朕
    2022-04-23
    我看到了很多人说go语言版本的问题,在最新的goland 当你新建项目的时候可以手动选择go语言版本快速创建的

    作者回复: 👍

    共 2 条评论
  • N0WMe
    2022-04-12
    老师,问下这个是什么错误当前go版本是1.16.15 [root@VM_0_2_centos go]# go get golang.org/dl/go1.15.15 # runtime /usr/local/go/src/runtime/mgcsweepbuf.go:87:80: memstats.gc_sys undefined (type mstats has no field or method gc_sys) /usr/local/go/src/runtime/mgcsweepbuf.go:106:102: memstats.gc_sys undefined (type mstats has no field or method gc_sys)
    展开

    作者回复: 是不是之前的安装有残留啊? Remove any previous Go installation by deleting the /usr/local/go folder (if it exists), then extract the archive you just downloaded into /usr/local, creating a fresh Go tree in /usr/local/go 。 这里有一个相同的问题:https://github.com/golang/go/issues/43320 可以参考一下。

  • 憨皮苏
    2022-01-14
    go1.15.13 安装成功了,但执行 go1.15.13 version 报 -bash: go1.15.13: command not found,不知道怎么解决

    作者回复: 是不是go1.15.3安装后的路径没有在PATH环境变量中?