Debian下编译安装Golang

目前(2016),Debian的稳定源只能安装go1.3版本。如果需要最新的版本,只能自行从源码编译安装。

卸载旧版本

sudo apt-get remove golang
sudo apt-get autoremove

源码下载

git clone https://github.com/golang/go.git

如果没有Git,必须自行解决;如果没有gcc,也需要自行安装。

此外,golang/go这个库实在太大,近200MB。完整从GitHub上拉下来,非常耗时;在GitHub连接不稳定时,也可能会失败。这属于网络问题,读者也需自行解决。

(adsbygoogle = window.adsbygoogle || []).push({});

按时间顺序,这里记录了一些相关的坑。如果想直接按照正确的步骤完成编译,可以跳到环境配置小节。

首次编译错误

Go不支持在根目录下编译,必须到src目录去。

$ cd src
$ ./all.bash
##### Building Go bootstrap tool.
cmd/dist
ERROR: Cannot find ~/go1.4/bin/go.
Set $GOROOT_BOOTSTRAP to a working Go tree >= Go 1.4.

我本来就是因为只有Go1.3,才要从源码安装新版本的。现在找我要Go1.4,这可如何是好?

自举

Go从1.5版本开始实现“自举”(Bootstrap),也就是用Go来实现Go、用Go来编译Go。之前都是用C来实现,编译Go项目就是编译C语言。

因此,只要把源码checkout到1.4版本,就可以不需要依赖于Go自身,解决自我依赖悖论。

git checkout go1.4
./all.bash

二次编译错误:import cycle not allowed

import cycle not allowed
package ./cmd/dist
    imports bytes
    imports errors
    imports runtime
    imports runtime/internal/atomic
    imports runtime

Go不支持循环导入,不知算进步还是退步。

不过,这里倒是体现了价值,提前报错。这个错误的主要原因,是编译时把GOROOT下的源码与GOROOT_BOOTSTRAP下的搞混了。如果Go与Java一样支持循环导入,那么这里就会进行一次错误的编译。

这个问题大致是路径配置错误导致的。未免误导,这里就不详述复现步骤了。

总之,先配置好GO的环境路径,能解决大多数错误。

环境配置

为了避免go1.4这个目录混杂在我本就已经混乱不堪的$HOME目录,我新建一个隐藏目录.golang,作为Go的相关环境配置的位置。

把以下配置加入shell的配置文件,bash是~/bashrc

export GOROOT=$HOME/.golang/go
export GOPATH=$HOME/.golang/path
export GOROOT_BOOTSTRAP=$HOME/.golang/go1.4
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
  • GOROOT是源码与可执行文件的位置。
  • GOPATH是放置Go的第三方安装包的位置。(编译过程中并未使用。)
  • GOROOT_BOOTSTRAP是用来自举的Go目录,是1.4版本。
  • export PATH=*是添加编译好的Go、以及以后通过go get安装的第三方库,进入可执行环境。这句,老鸟应该都很熟。 由于GOROOT目录下,只有gogofmt两个可执行文件,所以也可以用软链接来配置。

注意:这里出现了gogo1.4两个目录,它们本质上是相同的。为避免clone两遍,可以直接本地复制。

cp -r go go1.4

正确的编译步骤

  • 先进入GOROOT_BOOTSTRAP/src,执行git checkout go1.4.3,切换到1.4.3版本。
  • 执行./make.bash。 一般教程(比如本文前面首次编译错误小节)是用./all.bash,其实没必要。./all.bash是编译并测试,而./make.bash只是编译。前者大约5分钟,后者大约2分钟。对我们这种Go语言的使用者而非开发者来说,显然后者就够了。
  • 进入GOROOT目录,执行./make.bash

结束后,可以检查版本。

$ go version
go version devel +f8187ce Mon Nov 7 02:55:52 2016 +0000 linux/amd64

咦?怎么版本怪怪的!

这是因为master的HEAD,通常是一个开发中的提交,是最新不稳定版本。

如果想要稳定版怎么办?

和编译1.4.3版本类似,checkout过去再编译。比如,我现在是1.7.3版本。

$ git checkout go1.7.3
...
$ ./make.bash
...
$ go version
go version go1.7.3 linux/amd64

文/匿蟒(简书作者) 原文链接:http://www.jianshu.com/p/9c1e685bcb5b

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏从ORACLE起航,领略精彩的IT技术。

记录一则ASM实例阻塞,rbal进程异常的案例

36990
来自专栏人人都是极客

内存调试的相关分析

我们知道外设访问内存需要通过DMA进行数据搬移,关于cpu, cache, device, dma, memory的关系可以通过下图说明:

20530
来自专栏Hadoop实操

如何在Redhat中安装R的包及搭建R的私有源

继上一章如何在Redhat中配置R环境后,我们知道对于多数企业来说是没有外网环境的,在离线环境下如何安装R的包,能否搭建R的私有源对R的包进行管理。

92370
来自专栏搜云库

HBase 深入浅出

HBase 深入浅出 HBase 在大数据生态圈中的位置 提到大数据的存储,大多数人首先联想到的是 Hadoop 和 Hadoop 中的 HDFS 模块。大家熟...

511100
来自专栏高性能分布式系统设计

让Atom的go plus插件兼容govendor

目前,go plus插件不会在项目的vendor目录搜索, 有人提了issue,被残忍的关闭了. 解决方案: 在go path里面建立一个目录叫 vendor,...

388100
来自专栏Java职业技术分享

java 中的 Executors 简介与多线程在网站上逐步优化的运用案例

忽略了自定义的ThreadFactory、callable和unconfigurable相关的方法

16640
来自专栏解Bug之路

解Bug之路-记一次JVM堆外内存泄露Bug的查找 顶

JVM的堆外内存泄露的定位一直是个比较棘手的问题。此次的Bug查找从堆内内存的泄露反推出堆外内存,同时对物理内存的使用做了定量的分析,从而实锤了Bug的源头。笔...

10540
来自专栏腾讯Bugly的专栏

萝莉有话说:你的App真正适配了iOS 9吗?

时隔三月,如隔三秋。越过层层文档,穿过条条代码,小萝莉终于又和大家见面了!用户朋友们,我想死你们了!当然萝莉来此,并不是来和大家聊春晚的,我们的主题依旧是iOS...

34950
来自专栏存储

Xen server虚拟化中虚拟机磁盘文件丢失的处理办法

因服务器突然断电原因导致Xen Server服务器中一台VPS(即Xen Server虚拟机)不可用,虚拟磁盘文件丢失,通过电话联系北亚数据来进行恢复。硬件环...

21870
来自专栏FreeBuf

看我如何在渗透测试过程中发现并利用Serv-U漏洞进行操作系统提权

最近,我在做一个外网渗透测试的过程中,发现了SolarWinds文件共享程序Serv-U的一个漏洞,通过该漏洞我获得了Serv-U的管理权限,并能以系统用户身份...

29560

扫码关注云+社区

领取腾讯云代金券