Debian下编译安装Golang

简介: 我的Debian是用来工作的,因此用的是稳定源。稳定源的优点是,软件经过充分的测试,处于稳定版本。这种状态对于绝大多数软件,都是最合适的。 但是,对于一些需要最新版本的软件来说,稳定源太过于滞后。 官网不仅连接不稳定,二进制发布包也不够全。

我的Debian是用来工作的,因此用的是稳定源。稳定源的优点是,软件经过充分的测试,处于稳定版本。这种状态对于绝大多数软件,都是最合适的。

但是,对于一些需要最新版本的软件来说,稳定源太过于滞后。
1240
官网不仅连接不稳定,二进制发布包也不够全。

目前(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连接不稳定时,也可能会失败。这属于网络问题,读者也需自行解决。

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

首次编译错误

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

原文发布时间:2016-11-23
本文来自云栖社区合作伙伴“ Debian社区”,了解相关信息可以关注“ Debian社区”。
相关文章
|
9天前
|
监控 算法 Go
Golang深入浅出之-Go语言中的服务熔断、降级与限流策略
【5月更文挑战第4天】本文探讨了分布式系统中保障稳定性的重要策略:服务熔断、降级和限流。服务熔断通过快速失败和暂停故障服务调用来保护系统;服务降级在压力大时提供有限功能以保持整体可用性;限流控制访问频率,防止过载。文中列举了常见问题、解决方案,并提供了Go语言实现示例。合理应用这些策略能增强系统韧性和可用性。
40 0
|
22小时前
|
数据采集 人工智能 搜索推荐
快速入门:利用Go语言下载Amazon商品信息的步骤详解
本文探讨了使用Go语言和代理IP技术构建高效Amazon商品信息爬虫的方法。Go语言因其简洁语法、快速编译、并发支持和丰富标准库成为理想的爬虫开发语言。文章介绍了电商网站的发展趋势,如个性化推荐、移动端优化和跨境电商。步骤包括设置代理IP、编写爬虫代码和实现多线程采集。提供的Go代码示例展示了如何配置代理、发送请求及使用goroutine进行多线程采集。注意需根据实际情况调整代理服务和商品URL。
快速入门:利用Go语言下载Amazon商品信息的步骤详解
|
2天前
|
存储 编译器 Go
Go语言学习12-数据的使用
【5月更文挑战第5天】本篇 Huazie 向大家介绍 Go 语言数据的使用,包含赋值语句、常量与变量、可比性与有序性
38 6
Go语言学习12-数据的使用
|
3天前
|
Java Go
一文带你速通go语言指针
Go语言指针入门指南:简述指针用于提升效率,通过地址操作变量。文章作者sharkChili是Java/CSDN专家,维护Java Guide项目。文中介绍指针声明、取值,展示如何通过指针修改变量值及在函数中的应用。通过实例解析如何使用指针优化函数,以实现对原变量的直接修改。作者还邀请读者加入交流群深入探讨,并鼓励关注其公众号“写代码的SharkChili”。
9 0
|
3天前
|
存储 缓存 Java
来聊聊go语言的hashMap
本文介绍了Go语言中的`map`与Java的不同设计思想。作者`sharkChili`是一名Java和Go开发者,同时也是CSDN博客专家及JavaGuide项目的维护者。文章探讨了Go语言`map`的数据结构,包括`count`、`buckets指针`和`bmap`,解释了键值对的存储方式,如何利用内存对齐优化空间使用,并展示了`map`的初始化、插入键值对以及查找数据的源码过程。此外,作者还分享了如何通过汇编查看`map`操作,并鼓励读者深入研究Go的哈希冲突解决和源码。最后,作者提供了一个交流群,供读者讨论相关话题。
14 0
|
4天前
|
Java Go
Go语言学习11-数据初始化
【5月更文挑战第3天】本篇带大家通过内建函数 new 和 make 了解Go语言的数据初始化过程
17 1
Go语言学习11-数据初始化
|
4天前
|
自然语言处理 安全 Java
速通Go语言编译过程
Go语言编译过程详解:从词法分析(生成token)到句法分析(构建语法树),再到语义分析(类型检查、推断、匹配及函数内联)、生成中间码(SSA)和汇编码。最后,通过链接生成可执行文件。作者sharkchili,CSDN Java博客专家,分享技术细节,邀请读者加入交流群。
22 2
|
5天前
|
Java Linux Go
一文带你速通Go语言基础语法
本文是关于Go语言的入门介绍,作者因其简洁高效的特性对Go语言情有独钟。文章首先概述了Go语言的优势,包括快速上手、并发编程简单、设计简洁且功能强大,以及丰富的标准库。接着,文章通过示例展示了如何编写和运行Go代码,包括声明包、导入包和输出语句。此外,还介绍了Go的语法基础,如变量类型(数字、字符串、布尔和复数)、变量赋值、类型转换和默认值。文章还涉及条件分支(if和switch)和循环结构(for)。最后,简要提到了Go函数的定义和多返回值特性,以及一些常见的Go命令。作者计划在后续文章中进一步探讨Go语言的其他方面。
10 0
|
6天前
|
JavaScript 前端开发 Go
Go语言的入门学习
【4月更文挑战第7天】Go语言,通常称为Golang,是由Google设计并开发的一种编程语言,它于2009年公开发布。Go的设计团队主要包括Robert Griesemer、Rob Pike和Ken Thompson,这三位都是计算机科学和软件工程领域的杰出人物。
14 1
|
6天前
|
Go