1. 程式人生 > >golang安裝與理解

golang安裝與理解

通過兩種方式安裝

一、通過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/,官方經常抽風打不開。

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

在任意目錄檢視安裝版本:

[email protected]:~$ 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

[email protected]:~/golang$ pwd
/home/www/golang
[email protected]:~/golang$ go run hello.go 
Hello World!

【2】用go build命令生成hello可執行檔案

[email protected]:~/golang$ go build hello.go 
[email protected]:~/golang$ ls
hello  hello.go
[email protected]:~/golang$ ./hello 
Hello World!

【3】環境變數檢視

複製程式碼

[email protected]:/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下面

GOPATH下的src目錄就是接下來開發程式的主要目錄,所有的原始碼都是放在這個目錄下面,那麼一般我們的做法就是一個目錄一個專案,例如: $GOPATH/src/mymath 表示mymath這個應用包或者可執行應用,這個根據package是main還是其他來決定,main的話就是可執行應用,其他的話就是應用包。

(7)目錄結構

[email protected]:~/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

安裝完之後,我們可以進入如下目錄:

複製程式碼

[email protected]:~/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原始碼:

複製程式碼

package main

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的可執行檔案

[email protected]:~/golang/gopath/src/mathapp$ ls
main.go
[email protected]:~/golang/gopath/src/mathapp$ go build
[email protected]:~/golang/gopath/src/mathapp$ ls
main.go  mathapp

執行可執行檔案 ,輸出如下內容

[email protected]:~/golang/gopath/src/mathapp$ ./mathapp 
Hello, world.  Sqrt(2) = 1.414213562373095

如何安裝該應用,進入該目錄執行go install,那麼在$GOPATH/bin/linux_386下增加了一個可執行檔案mathapp, 還記得前面我們把$GOPATH/bin加到我們的PATH裡面了,這樣可以在命令列輸入如下命令就可以執行

複製程式碼

[email protected]:~/golang/gopath/src/mathapp$ go install
[email protected]:~/golang/gopath/src/mathapp$ cd $GOPATH/bin
[email protected]:~/golang/gopath/bin$ ls
linux_386
[email protected]:~/golang/gopath/bin$ cd linux_386/
[email protected]:~/golang/gopath/bin/linux_386$ ls
mathapp
[email protected]:~/golang/gopath/bin/linux_386$ ./mathapp 
Hello, world.  Sqrt(2) = 1.414213562373095

複製程式碼

以上我們展示如何編譯和安裝一個可執行的應用,以及如何設計我們的目錄結構。

獲取遠端包

 go語言有一個獲取遠端包的工具就是 go get

通過這個命令可以獲取相應的原始碼:

[email protected]:~/golang/gopath/src$ go get github.com/astaxie/beedb
[email protected]:~/golang/gopath/src$ ls
github.com  mathapp  mymath

通過上面獲取的程式碼在我們本地的原始碼相應的程式碼結構如下:

複製程式碼

[email protected]:~/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 寫的 定時工作管理員 

切換到$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 = [email protected]
mail.host = smtp.163.com
mail.port = 25
mail.user = [email protected]
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);

結束!