03|配好环境:选择一种最适合你的Go安装方法
03|配好环境:选择一种最适合你的Go安装方法
讲述:Tony Bai
时长17:21大小15.86M
选择 Go 版本
安装 Go
在 Linux 上安装 Go
在 Mac 上安装 Go
在 Windows 上安装 Go
安装多个 Go 版本
方法一:重新设置 PATH 环境变量
方法二:go get 命令
方法三:go get 命令安装非稳定版本
配置 Go
小结
思考题
赞 61
提建议
精选留言(36)
- 薛定谔猫的小确幸💯2021-10-20备注:GOPROXY由于国内的网络环境,我们可以通过配置GOPROXY避免DNS污染导致的模块拉取缓慢或失败的问题,加速你的构建。 windows cmd下: go env -w GOPROXY=https://goproxy.cn,direct共 2 条评论38
- 陈彬2021-10-18Tony老师 $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_eb6c142021-10-18Mac环境下更改GOPROXY环境变量的终端命令行: export GOPROXY="https://goproxy.cn,direct"
作者回复: 手动点赞!
共 2 条评论9 - lesserror2021-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-181、按要求操作,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 - SummerRecord2022-05-02Windows可以用winget一键安装 winget install GoLang.Go
作者回复: 👍。这个还真没试过。
1 - mikewoo2022-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-20FYI: 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 - Rock2021-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 - Lee2022-10-25 来自北京GO111MODULE="off" 神奇 我安装的1.19.2 这个居然是off
作者回复: 不应该的,确认以前没有设置过? go env看一下 GOENV这个变量,看看这个路径下的文件是否存在,如存在内容是啥。 另外看一下shell环境变化是否设置了GO111MODULE。
共 3 条评论 - Geek_JcoLE2022-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.Lee2022-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 条评论 - N0WMe2022-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-14go1.15.13 安装成功了,但执行 go1.15.13 version 报 -bash: go1.15.13: command not found,不知道怎么解决
作者回复: 是不是go1.15.3安装后的路径没有在PATH环境变量中?