转自:https://www.cnblogs.com/tinywan/p/6928300.html
    
   
    
     通过两种方式安装
    
   
    
     一、通过apt-get安装
    
    
    
     1、安装
    
   
sudo apt-get install golang
    
     2、设置GOPATH变量
    
   
    
     GOPATH是扩展库的目录,Go先搜索标准库目录,然后搜索GOPATH库目录,所有的非标准库都放在GOPATH下。以GOPATH为“/usr/local/go”目录为例子:
    
   
    (1)把export GOPATH=/opt/go加入到~/.bashrc文件的最后。
    
    (2)source ~/.bashrc 重新加载配置
   
    这样就加好了GOPATH。
    
     注意:apt-get命令安装只能安装go1.6版本现在很多开源项目都用上了1.7以上建议手动安装更高版本。
    
   
    
     二、手动安装新的稳定版本(重要)
    
   
    
     1、以1.8版本为例子下载go1.8.linux-amd64.tar.gz安装包,官方下载地址:https://golang.org/dl/,官方经常抽风打不开。
    
   
    
     下载地址:
     
      http://www.golangtc.com/download
     
    
   
    
     
    
   
    
     2、使用tar命令将安装包解压到/usr/local目录下:
    
   
tar -xzf go1.8.linux-amd64.tar.gz  -C /usr/local
    
     注意:root 权限问题
    
   
    
     验证安装结果,执行以下命令:
    
   
/usr/local/go/bin/go version
    
     出现以下结果表示安装成功:
    
   
    
     
    
   
    
     3、环境变量的设置
    
   
    
     【1】单个用户配置:在 ~/.bashrc文件末尾加上如下环境变量:
    
   
vim ~/.bashrc
export GOPATH=/opt/go
export GOROOT=/usr/local/go
export GOARCH=386
export GOOS=linux
export GOBIN=$GOROOT/bin/
export GOTOOLS=$GOROOT/pkg/tool/
export PATH=$PATH:$GOBIN:$GOTOOLS
    
     
     
    
   
    
     重新加载 profile 文件,加载环境变量到内存。查看安装版本
    
   
source ~/.bashrc
    
     【2】多用户配置(推荐)
    
   
vim /etc/profile  # 文件末尾添加以下内容
export GOPATH=/home/www/golang/gopath 
export GOROOT=/usr/local/go
export GOARCH=386
export GOOS=linux
export GOTOOLS=$GOROOT/pkg/tool
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
    
     重新加载 profile 文件,加载环境变量到内存
    
   
source /etc/profile
    
     在任意目录查看安装版本:
    
   
www@TinywanAliYun:~$ go version
go version go1.9.1 linux/amd64
    
     附带:Windows 环境变量配置
    
   
    
     
    
   
    
     4.、编写hello.go文件,测试安装是否成功,代码如下:
    
   
package main
import "fmt"
func main() {
    fmt.Println("Hello World!")
}
    
     5、运行hello.go
    
    
    
     【1】用go run命令直接运行hello.go
    
   
www@TinywanAliYun:~/golang$ pwd
/home/www/golang
www@TinywanAliYun:~/golang$ go run hello.go 
Hello World!
    
     【2】用go build命令生成hello可执行文件
     
    
   
www@TinywanAliYun:~/golang$ go build hello.go 
www@TinywanAliYun:~/golang$ ls
hello  hello.go
www@TinywanAliYun:~/golang$ ./hello 
Hello World!
    
     【3】环境变量查看
    
   
www@TinywanAliYun:/usr/local/go$ go env
GOARCH="386"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/www/golang/gopath"
GORACE=""
GOROOT="/usr/local/go"
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
GO386="sse2"
CC="gcc"
GOGCCFLAGS="-fPIC -m32 -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build103397464=/tmp/go-build -gno-record-gcc-switches"
CXX="g++"
CGO_ENABLED="0"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
    
     注意:GOPATH路径,要自己动手创建:mkdir -p /home/www/golang/gopath
    
   
    
     主要变量说明:
    
   
    
     1、GOROOT就是go的安装路径
    
   
    
     2、GOPATH是作为编译后二进制的存放目的地和import包时的搜索路径 (其实也是你的工作目录, 你可以在src下创建你自己的go源文件, 然后开始工作)
    
   
    
     3、GOPATH目录结构
    
   
goWorkSpace // (goWorkSpace为GOPATH目录)
  -- bin    // golang编译可执行文件存放路径,可自动生成。
  -- pkg    // golang编译的.a中间文件存放路径,可自动生成。
  -- src    // 源码路径。按照golang默认约定,go run,go install等命令的当前工作路径(即在此路径下执行上述命令)。
    
     GOPATH之下主要包含三个目录: bin、pkg、src
    
   
    
     (1)bin目录主要存放可执行文件;
    
   
    
     (2)pkg目录存放编译好的库文件, 主要是*.a文件;
    
   
    
     (3)src目录下主要存放go的源文件
    
   
    
     (4) GOPATH可以是一个目录列表, go get下载的第三方库, 一般都会下载到列表的第一个目录里面
    
   
    
     (5) 需要把GOPATH中的可执行目录也配置到环境变量中, 否则你自行下载的第三方go工具就无法使用了, 操作如下:
    
   
    
     (6)GOBIN go install编译存放路径。不允许设置多个路径。可以为空。为空时则遵循“约定优于配置”原则,可执行文件放在各自GOPATH目录的bin文件夹中(前提是:package main的main函数文件不能直接放到GOPATH的src下面
    
   
    
     参考文章:
     
      https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/01.2.md
     
    
   
    
     GOPATH下的src目录就是接下来开发程序的主要目录,所有的源码都是放在这个目录下面,那么一般我们的做法就是一个目录一个项目,例如: $GOPATH/src/mymath 表示mymath这个应用包或者可执行应用,这个根据package是main还是其他来决定,main的话就是可执行应用,其他的话就是应用包。
    
   
    
     (7)目录结构
    
   
www@TinywanAliYun:~/golang/gopath$ tree -L 2
.
├── bin
├── pkg
└── src
    
     
      注意:$GOPATH 指定的目录要自己新建,包括下面的src目录
      
     
     下面我就以mymath为例来讲述如何编写应用包,执行如下代码
    
   
cd $GOPATH/src
mkdir mymath
    
     新建文件sqrt.go,内容如下
    
   
    // $GOPATH/src/mymath/sqrt.go源码如下:
    
    package mymath
    func Sqrt(x float64) float64 {
    
    z := 0.0
    
    for i := 0; i < 1000; i++ {
    
    z -= (z*z – x) / (2 * x)
    
    }
    
    return z
    
    }
    
    
     这样我的应用包目录和代码已经新建完毕,注意:一般建议package的名称和目录名保持一致
    
   
    
     编译应用
    
   
    
     上面我们已经建立了自己的应用包,如何进行编译安装呢?有两种方式可以进行安装
    
   
    
     1、只要进入对应的应用包目录,然后执行
     
      go install
     
     ,就可以安装了
    
   
    
     2、在任意的目录执行如下代码
     
      go install mymath
     
    
   
    
     安装完之后,我们可以进入如下目录:
    
   
www@TinywanAliYun:~/golang/gopath$ tree -L 3
.
├── bin
├── pkg
│   └── linux_386
│       └── mymath.a
└── src
    └── mymath
        └── sqrt.go
    
     这个.a文件是应用包,那么我们如何进行调用呢?
    
   
    
     接下来我们新建一个应用程序来调用这个应用包
    
   
    
     新建应用包mathapp
    
   
cd $GOPATH/src
mkdir mathapp
cd mathapp
vim main.go
    
     
      $GOPATH/src/mathapp/main.go
     
     源码:
    
   
     import (
     
     “mymath”
     
     “fmt”
     
     )
     func main() {
     
     fmt.Printf(“Hello, world.  Sqrt(2) = %v\n”, mymath.Sqrt(2))
     
     }
     
    
    
     可以看到这个的package是
     
      main
     
     ,import里面调用的包是
     
      mymath
     
     ,这个就是相对于
     
      $GOPATH/src
     
     的路径,如果是多级目录,就在import里面引入多级目录,如果你有多个GOPATH,也是一样,Go会自动在多个
     
      $GOPATH/src
     
     中寻找。
    
   
    
     如何编译程序呢?进入该应用目录,然后执行
     
      go build
     
     ,那么在该目录下面会生成一个mathapp的可执行文件
    
   
www@TinywanAliYun:~/golang/gopath/src/mathapp$ ls
main.go
www@TinywanAliYun:~/golang/gopath/src/mathapp$ go build
www@TinywanAliYun:~/golang/gopath/src/mathapp$ ls
main.go  mathapp
    
     执行可执行文件 ,输出如下内容
    
   
www@TinywanAliYun:~/golang/gopath/src/mathapp$ ./mathapp 
Hello, world.  Sqrt(2) = 1.414213562373095
    
     如何安装该应用,进入该目录执行
     
      go install
     
     ,那么在$GOPATH/bin/linux_386下增加了一个可执行文件mathapp, 还记得前面我们把
     
      $GOPATH/bin
     
     加到我们的PATH里面了,这样可以在命令行输入如下命令就可以执行
    
   
www@TinywanAliYun:~/golang/gopath/src/mathapp$ go install
www@TinywanAliYun:~/golang/gopath/src/mathapp$ cd $GOPATH/bin
www@TinywanAliYun:~/golang/gopath/bin$ ls
linux_386
www@TinywanAliYun:~/golang/gopath/bin$ cd linux_386/
www@TinywanAliYun:~/golang/gopath/bin/linux_386$ ls
mathapp
www@TinywanAliYun:~/golang/gopath/bin/linux_386$ ./mathapp 
Hello, world.  Sqrt(2) = 1.414213562373095
    
     以上我们展示如何编译和安装一个可运行的应用,以及如何设计我们的目录结构。
    
   
    
     获取远程包
    
   
    go语言有一个获取远程包的工具就是
    
     
      go get
     
    
   
    
     通过这个命令可以获取相应的源码:
    
   
www@TinywanAliYun:~/golang/gopath/src$ go get github.com/astaxie/beedb www@TinywanAliYun:~/golang/gopath/src$ ls github.com mathapp mymath
通过上面获取的代码在我们本地的源码相应的代码结构如下:
    
    
   
www@TinywanAliYun:~/golang/gopath$ tree -L 3 . ├── bin │ └── linux_386 │ └── mathapp ├── pkg │ └── linux_386 │ ├── github.com │ └── mymath.a └── src ├── github.com │ └── astaxie ├── mathapp │ └── main.go └── mymath └── sqrt.go
    go get本质上可以理解为首先第一步是通过源码工具clone代码到src下面,然后执行
    
     
      go install
     
     ,
    
    在代码中如何使用远程包,很简单的就是和使用本地包一样,只要在开头import相应的路径就可以:
   
import "github.com/astaxie/beedb"
从上面的结构我们可以很清晰的看到,bin目录下面存的是编译之后可执行的文件,pkg下面存放的是应用包,src下面保存的是应用源代码
    
     刚学习的支持扩展一下,搞一个Golang 写的 定时任务管理器
    
   
    
     
    
   
    
     源码地址:
     
      https://github.com/lisijie/webcron
     
    
   
    
     切换到$GOPATH/src目录下,下载源码:
    
   
git clone https://github.com/lisijie/webcron.git
    
     
      通过 go build 编译一个可执行文件webcron???
     
     
      这里我执行不了
     
    
   
gopath/src# cd webcron/
gopath/src/webcron# ls
app  conf  install.sql  main.go  pack.sh  README.md  run.sh  screenshot.png  static  views
gopath/src/webcron# go build
gopath/src/webcron# ls
app  conf  install.sql  main.go  pack.sh  README.md  run.sh  screenshot.png  static  views  webcron
    
     
    
   
    
     以上提示表示链接mysql数据有问题
    
   
    
     修改mysql数据库配置信息,创建一个数据库webcron
    
   
    
     mysql -u root -p123456
    
   
mysql> create database webcron;
Query OK, 1 row affected (0.03 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| webcron            |
| zabbix             |
+--------------------+
5 rows in set (0.00 sec)
    
     导入数据:
    
   
/home/www/gopath/src/webcron#  mysql -u root -p123456 -D webcron < install.sql
    
     修改配置文件:vim conf/app.conf
    
   
# 数据库配置
db.host = 127.0.0.1
db.user = root
db.password = "123456"
db.port = 3306
db.name = webcron
db.prefix = t_
db.timezone = Asia/Shanghai
    
     再次执行,看来是OK了
    
   
    
     
    
   
    
     浏览器查看:http://127.0.0.1:8000/login
    
   
    
     
    
   
    
    
   
    
     
    
   
    
     
    
   
    
     修改可执行文件到后台运行
    
   
    
     
    
   
    
     再次测试mysql数据库信息
    
   
    
     
    
   
    
     定制任务执行的结果
    
   
    
     
    
   
    
     
    
   
    
     发送邮件配置 : vim conf/app.conf
    
   
# 邮件服务器配置
mail.queue_size = 100
mail.from = tinywan@163.com
mail.host = smtp.163.com
mail.port = 25
mail.user = tinywan@163.com
mail.password = 123456
    
     任务失败,邮件通知信息
    
   
    
     
    
   
    
     邮箱接受到的信息
    
   
    
     
    
   
    
     
    
   
    
     两封邮件的时间间隔恰好是10s
    
   
    
     
    
   
    
     添加一个redis 执行脚本
    
   
#!/bin/bash
logs_path="/home/www/bin/"
TIME=`date '+%Y-%m-%d %H:%M:%S'`
REDIS_HOST='127.1.1.1'
REDIS_PORT='639'
REDIS_PASS='tinywan2321'
REDIS_DB=12
GO=$(redis-cli -h 127.0.01 -p 23423  -a  dddd -n 12 get Golang)
echo " Redis Crontab [ " $(date '+%Y-%m-%d %H:%M:%S') " ] ::" $GO  >> /home/www/bin/crontab_redis_12.log
    
     脚本执行结果,红色为redis 数据库获取的数据
    
   
    
     
    
   
    
     php 执行脚本
    
   
#!/usr/bin/php
<?php
$path = '/home/www/bin/php.txt';
$time = date("Y-m-d H:i:s")."\n";
file_put_contents($path,$time,FILE_APPEND);
    
     结束!
    
   
    
     总结:折腾了半天都是$GOPATH 的坑,话说自己太笨了,给点时间还是可以的啦!(*^__^*) 嘻嘻……
    
   
    
    
   
 

