1. 背景

  在当前的中国网络环境下,我们无法访问Google的服务的,包括Golang.org。从第三方网站下载预编译的二进制Go发行版可能存在第三方源代码注入的风险,例如之前的XcodeGhost。
  Go的权威仓库地址是 https://go.googlesource.com/go,同时还有一个镜像仓库在 https://github.com/golang/go  (至少在目前,我们还能访问github)

2. 问题

  Go1.7的编译过程需要Go1.4的执行文件来实现 bootstrap(自举)(简单来说: Go需要Go自身来编译,搭建go1.5及以上版本的编译环境需要先安装go1.4版本)

3. 解决方案

  从Github的Go仓库镜像获取Go的源代码

  首先编译Go1.4(只需要gcc和glibc-devel,不需要Go来编译,由此可见go1.4.x 是个特殊的版本!)
  使用编译好的Go1.4的二进制文件来编译Go1.6

3.1 准备

  • 如果之前已经安装过老版本的Go,清除$GOPATH, $GOROOT变量。
  • 安装好Git
  • 配置 Git

    需要从github上拉代码,得先注册一个github账号(https://github.com)

    然后在 linux 执行

    > git config --global user.email "email-for-github"

    > git config --global user.name "user name"    

  • 创建SSH key,添加Public Key到Github账号。

    > ssh-keygen -t rsa -b 2048

    > ssh-add ~/.ssh/id_rsa

    复制 ~/.ssh/id_rsa.pub 中的 Public Key 到 github SSH settings 以添加新的 SSH key

  • 安装 gcc和glibc-devel

    > sudo yum install gcc glibc-devel

3.2 从源代码编译安装Go1.4

  • 下载代码

    cd /opt
    wget https://studygolang.com/dl/golang/go1.4.3.src.tar.gz

    tar xvf tar xvf go1.4.3.src.tar.gz

  • 编译&安装

    cd go/src

    ./all.bash

    cp -rp /opt/go /usr/local/go1.4

  • 设置环境变量 GOROOT_BOOTSTRAP

    $GOROOT_BOOTSTRAP(默认值是~/go1.4,编译go1.5及以上版本必需)

    vim /etc/profile

    # Golang Env
    export GOROOT_BOOTSTRAP=/usr/local/go1.4
    export PATH=$PATH:$GOROOT_BOOTSTRAP

    source /etc/profile

3.3 从源代码编译安装Go1.11

  • 下载代码
    wget https://studygolang.com/dl/golang/go1.11.src.tar.gz
    mkdir /opt/mygo
    tar xvf go1.11.src.tar.gz -C /opt/mygo
  • 编译&安装
    cd /opt/mygo/go/src
    ./all.bash
    cp -rp /opt/mygo/go /usr/local/go
  • 设置环境变量

    vim /etc/profile

    在 # Golang Env 下添加

   export GOROOT=/usr/local/go

    #提前创建 go 工作目录

    mkdir /opt/goWork

    在 /etc/profile  添加环境变量

    export GOPATH=/opt/goWork 
    export GOBIN=$GOROOT/bin

    vim /etc/profile

    修改 /etc/profile 中的PATH 环境变量

    export PATH=$PATH:$GOROOT_BOOTSTRAP:$GOPATH:$GOBIN

    source /etc/profile 

  注:

  • Go二进制文件默认安装到 /usr/local/go,自定义安装目录时,必须设置GOROOT环境变量
  • GOPATH允许多个目录(一个项目一个),当有多个目录时,请注意分隔符,多个目录的时候Windows是分号,Linux系统是冒号,当有多个GOPATH时,默认会将go get的内容放在第一个目录下

    工作目录介绍

    工作区是一个目录层次结构,它的根目录有三个目录:
    src 包含Go源文件
    pkg 包含对象和包
    bin 包含可执行命令
    Go工具创建源码包并安装二进制文件到pkg和bin目录下
    src目录通常包含多个版本控制库(如Git或Mercurial),跟踪一个或多个源包的开发

  • 测试

    退出shell重新登录

    go version

    go version go1.7 linux/amd64

4. go 工作目录

  所有Go可执行程序都通过静态方式链接在一起,所以在运行时是不需要相关的包对象(库)

  go install 会把库文件 xxx.a 放到 $GOPATH/pkg 相应的 arch 下面,这样 go命令可以直接找到对应的包对象,避免不必要的重复编译

  linux_amd64是为了根据操作系统和你的系统架构交叉编译

当你建立工作空间目录后,你需要把工作空间目录的路径添加的GOPATH环境变量中。GOPATH环境变量支持多个值,如果你有多个工作空间,可以把多个工作空间值都添加到这个环境变量中,window系统使用分号";"分隔不同值,Linux或Unix系统使用冒号”:“分隔不同值。另外,还要将所有工作空间的bin路径添加到PATH环境变量中

当然,如果你的工作空间不止一个,PATH变量中不能直接使用$GOPATH/bin,要分别将各个工作空间中的bin路径添加进去。

需要注意的是,GOPATH环境变量的值不能与安装的go目录相同。go目录中同样有src、pkg、bin等类似工作空间的目录结构,不过其中包含的是go的标准模块,最好不要讲自己的工作空间和go目录混合

通常 项目代码目录 建成 $GOPATH/src/github.com/ [ nsq ] 的形式

5. package 引用

  默认

  先会到 $GOROOT/src 下查找

  其次到 $GOPATH/src 下查找

   $GOPATH/src 下的目录结构最好跟 github 上保持一致,方便拉取github上的代码

 

参考资料:

https://github.com/northbright/Notes/blob/master/Golang/china/install-go1.6-from-source-on-centos7-in-china.md

https://github.com/northbright/Notes/tree/master/Golang/china

http://www.cnblogs.com/mountaingeek/p/5951156.html

go 源码下载

https://studygolang.com/dl
http://www.golangtc.com/download

遇到的问题

1.

解决:ssh-add ~/.ssh/id_rsa

  ssh-add命令是把专用密钥添加到ssh-agent的高速缓存中。该命令位置在/usr/bin/ssh-add

  ssh-add -l 查看ssh-agent中的秘钥

go环境搭建—基于CentOS6.8的更多相关文章

  1. lamp环境搭建(centos6.9+apache2.4+mysql5.7+php7.1)

    lamp环境搭建(centos6.9+apache2.4+mysql5.7+php7.1) 安装前准备:CentOS 6.9 64位 最小化安装 yum install -y make gcc gcc ...

  2. Lamp环境搭建Linux CentOS6.5编译安装mysql5.6

    经典web开发组合Lamp环境搭建之mysql安装详解 安装前准备 通过rpm命令检查centos上是否已经安装mysql,然后卸载已经存在的mysql版本 [root@localhost src]# ...

  3. 【Hadoop环境搭建】Centos6.8搭建hadoop伪分布模式

    阅读目录 ~/.ssh/authorized_keys 把公钥加到用于认证的公钥文件中,authorized_keys是用于认证的公钥文件 方式2: (未测试,应该可用) 基于空口令创建新的SSH密钥 ...

  4. selenium2环境搭建----基于python语言

    selenium支持多种语言如java.c#.Python.PHP等,这里基于python语言,所以这里搭建环境时需做俩步操作: ----1.Python环境的搭建 ----2.selenium的安装 ...

  5. java selenium (三) 环境搭建 基于Maven

    现在Java的大部分项目都是基于Maven,  在Maven项目中使用Selenium2. 非常简单. 首先你需要配置好Maven的环境 可以参考本博客的Maven教程系列,Maven入门教程(一) ...

  6. k8s环境搭建--基于kubeadm方法

    环境 master node: 数量 1, 系统 ubuntu 16.04_amd64 worker node: 数量 1, 系统 ubuntu 16.04_amd64 kubernetes 版本: ...

  7. STM32开发/烧录/调试环境搭建 基于:Win10+STM32Cube+openocd+cmsis-dap(dap-link)

    dap-link是个不错的STM32下载/调试工具,然而STM32Cube并没有直接支持它,只能通过openocd的方式间接支持. 网络上虽然已经有了其他人的教程,不过基本都是基于linux或者msy ...

  8. k8s环境搭建--基于minik8s方法

    minik8s 安装 关闭selinux.开启ipv6 sudo bash selinux_ipv6.sh 下载kubectl和minikube 下载minikube,因为国外的源被墙了,所以只能用阿 ...

  9. Maven 项目使用mybatis的环境搭建-基于xml形式实现查询所有的功能

    首先了解一下什么是 MyBatis? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. ...

随机推荐

  1. CCCC L2-007. 家庭房产 建图 XJB模拟

    https://www.patest.cn/contests/gplt/L2-007 题解:一开始是想直接并查集,一个家就是一个集合,对每个集合维护一个人数num1一个房产数num2 一个房产面积ar ...

  2. phpstrom 配置xdebug在vagrant上调试

    参数 linux system : centos6. vagrant: PHP: phpstrom:2017.2 步骤1: 安装xdebug扩展(已安装可跳过步骤1),首先去 xdebug官方下载扩展 ...

  3. 一键安装openstack juno 之controller node.

    原文名称: OpenStack Juno Scripted Installation on CentOS 7 Step I:  本机信息配置 CONTROLLER_IP=192.168.173.133 ...

  4. html中label及加上属性for之后的用法

    定义和用法 <label> 标签为 input 元素定义标签(label). label 元素不会向用户呈现任何特殊的样式.不过,它为鼠标用户改善了可用性,因为如果用户点击 label 元 ...

  5. requests库的post请求

    requests库的post请求 #coding:utf-8 import requests import json class Trans(object): def __init__(self, w ...

  6. 配合dedecms内容模型实现后台输入栏目id前端输出文章列表

    为了简化开发的工作量,也方便编辑快速操作,决定将后台进行重新设置.配合dedecms内容模型实现后台输入栏目id前端输出文章列表,这样制作科室专题页也变快了很多.比如,我们添加一个“科室专家栏目id” ...

  7. UVA 11136 Hoax or what (multiset)

    题目大意: 超时进行促销.把账单放入一个箱子里 每次拿取数额最大的和最小的,给出 最大-最小  的钱. 问n天总共要给出多少钱. 思路分析: multiset 上直接进行模拟 注意要使用long lo ...

  8. MyEclipse10.0 注册破解步骤

    MyEclipse 10.0破解 激活(java编写,适用于装有java环境的各种操作系统,Windows,Linux,MacOS) =====[方法一]=====[第一步]:输入任意用户名[第二步] ...

  9. 跟我学Makefile(七)

    定义模式规则 使用模式规则来定义一个隐含规则.一个模式规则就好像一个一般的规则,只是在规则中,目标的定义需要有“%”字符.“%”的意思是表示一个或多个任意字符.在依赖目标中同样可以使用“%”,只是依赖 ...

  10. BGD-py实现学习【1】[转载]

    转自:https://github.com/icrtiou/Coursera-ML-AndrewNg 1.源码-对数据读取 import numpy as np import pandas as pd ...