Golang Go Go Go part1:安裝及運行

golang 知識圖譜node

https://www.processon.com/view/link/5a9ba4c8e4b0a9d22eb3bdf0linux

 

1、安裝golang

最新版本安裝包地址:https://golang.google.cn/dl/函數

要本身編譯安裝下載 source 源碼包,不然根據本身 LINUX 系統下載對應版本的編譯包,這裏直接下載  go1.11.4.darwin-amd64.tar.gz測試

把下載的 golang 包解壓到 /opt 下面:  ui

sudo tar -C /opt/ -xzf go1.11.4.linux-amd64.tar.gz

 

解壓完 golang 語言包存在 /opt/go 下, 使用命令查看go程序路徑 , 顯示 go 程序的路徑是 /opt/go/bin/gogoogle

  whereis go

 

查看 go 版本: 編碼

  /opt/go/bin/go version

 

若是須要在 終端內直接 輸入 go 就能全局地使用 go 程序, 還須要配置系統環境變量。spa

在 /etc/profile 文件後面加入配置:命令行

export GOROOT=/opt/go
export GOPATH=/home/ecalf/goProject
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN:$GOROOT/bin

 

或者創建下面軟件接

sudo ln -s /opt/go/bin/go /usr/bin/go
sudo ln -s /opt/go/bin/go /usr/local/bin/go

 

這些配置方法跟 node 的配置相似,有開發過 node 的經驗應該會很熟悉。 

 

查看 go 相關環境變量

go env

輸出

GOARCH="amd64"
GOBIN="/home/ecalf/goProject/bin"
GOCACHE="/home/ecalf/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/ecalf/goProject"
GOPROXY=""
GORACE=""
GOROOT="/opt/go"
GOTMPDIR=""
GOTOOLDIR="/opt/go/pkg/tool/linux_amd64"
GCCGO="/usr/bin/gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build111443368=/tmp/go-build -gno-record-gcc-switches"

 

GOROOT 是 go 所在目錄,go 命令在 GOROOT/bin 內;

GOPATH 是 go 的工做目錄,能夠指定多個文件夾。

$GOPATH 目錄約定有三個子目錄:

1. src 存放源代碼(好比:.go .c .h .s等)
2. pkg 編譯後生成的文件(好比:.a)
3. bin 編譯後生成的可執行文件(爲了方便,把此目錄加入到 $PATH 變量中)

全部開發的 go 代碼都要放在 GOPATH/src 指定的目錄下,go get 等命令獲取的代碼包也會自動放置在這些目錄下。

 

環境變量配置好後,查看go版本只要在命令行輸入

go version

 

關於程序文件編碼: Go語言的源文件採用UTF8編碼。

 

2、hello world

在 $GOPATH/src 下建立項目文件夾 hello,在 項目文件夾下面編輯文件:  hello.go 

  
package main
import "fmt"

/*first go program */
//hello world
func main() { //go 程序的新行不能以 { 開始
   fmt.Println("Hello, World!")
}

 

進入$GOPATH/src/hello 目錄  

使用 go run 命令直接在終端執行,查看運行結果:

go run ./hello.go

 

 使用 go build 命令把 go 程序編譯爲可執行文件

go build ./hello.go

 

使用 go install 命令編譯並生成可執行文件

go install hello

命令執行後,在 $GOPATH/bin 下生成了能夠行文件  hello

 

 

在終端執行生成的程序

./hello

 

下面是幾個關於運行和編譯的命令:

go run: 編譯並直接運行程序,產生一個臨時文件,直接在命令行輸出程序執行結果但不生成可執行文件,多用於程序的簡單調試。當執行的文件引用了包內其餘文件的方法時,必須指定編譯用到的全部文件,這個時候可使用通配符來指定編譯全部文件   go run *.go 。   該命令執行的文件能夠放在任何目錄內,只要正確指定要編譯的文件路勁便可,但這些文件必須是同一個 main 包內的。

go build:測試編譯包,主要檢查是否會有編譯錯誤,若是是一個可執行文件的源碼(便是 main 包,go 的程序入口是 main 函數),就會在當前目錄下直接生成一個可執行文件。

go install:該命令有2個做用,1.編譯程序,先編譯全部導入的包文件,而後纔會編譯主程序;2.將編譯生成的可執行文件放到 $GOPATH/bin 目錄下,編譯後的包文件放到 $GOPATH/pkg 目錄下。

 

其餘 go 命令文檔可查閱下面官方文檔

https://golang.google.cn/cmd/

 

 

 

3、golang 的 package 概念

GO自己沒有項目的概念,只有包,go 經過package來組織結構,每一個 go 代碼文件的第一行非註釋代碼都必須使用 package 命令來聲明代碼所屬的包名,同一個目錄中(不含子目錄)的全部代碼文件只能屬於同一個包,即一個文件夾就是一個包。

go 的包分兩種:可執行包(命令包,有main函數,編譯後放在$GOPATH/bin內)和不可執行包(只供調用,沒有main函數,編譯後放在$GOPATH/pkg內),包開發源代碼都放在 $GOPATH/src 目錄下,GO命令和編譯器會在 $GOROOT/src 和 $GOPATH/src 目錄下搜索相應的包。

由於導入包的時候要經過包文件的目錄,而使用包提供的方法則須要經過包名,爲了方便包定位,供調用的pkg包應該保持包名和目錄名稱一致,有main函數的可執行包的包名必須是main,可使用程序名稱做爲包的文件夾名稱。

 

可執行包的 main 函數:

  •  main 函數是go程序的入口, main 函數必須放在 package 名稱爲 main 的包內。
  • 一個可執行程序有且只有一個main函數,同一個包內不能出現兩個main函數,不然 go build 命令和 go install 命令將報錯。

 

包的初始化:

  • 一個包若是依賴另外一個包,依賴包會被先導入和初始化。
  • 包 能夠定義 0個或多個 init 函數,包的 init 函數將在包被導入初始化後先於 main 函數自動執行。
  • init 函數不須要傳入參數,也不會返回任何值,不能被主動調用(若是被註定調用會提示init未聲明),重複導入包只會執行一次 init 函數,init 函數能夠調用其餘函數。
  • 若是一個包有多個init函數,他們的執行順序是不肯定的。

 

包的導入:

  • 若是導入了一個包但沒有使用它,編譯時將報錯。
  • 若是你引用包只是爲了調用 init 函數去作一些初始化工做,但不打算使用包,能夠將導入包重命名爲 _  (空標識符,也就是下劃線)來避免報錯。
  • 當導入第三方包時,包名極可能很是接近或相同,須要使用別名來進行區別和調用。
  • 若是導入的包被重命名爲 . (點號),使用包的的方法時能夠省略包名,但通常不建議這樣作。
  • 包的可見性:定義的常量、變量、類型、接口、結構、函數等的名稱若是是小寫字母或下劃線開頭,表示是隻能在包內使用(有點像 protected),同一個包內,不一樣的文件之間能夠自由調用各文件定義的常量、變量、函數,若是是大寫字母開頭則表示能夠在包外被訪問(有點像 public)。

導入 xxx/yyy 包並重名別名

import _ "xxx/yyy"

  

 

包的執行順序: 依賴包常量、變量、函數 初始化,賦值 -> 依賴包 init函數 -> 包的初始化 ,賦值 -> 包的init函數 -> main 函數

 

一個簡單的測試

src/bin/hello 包內有兩個文件:

 

hello.go

package main
import "fmt"
import cat "../cat"



func main() {
	fmt.Println("main function")
   fmt.Println("Hello, World!")
   sayHi();
   wei();
   cat.SayHello();//調用cat包的方法

}

func sayHi(){
	fmt.Println("say hi")
}

func init(){
    fmt.Println("init in hello")
}

    

wei.go

package main
import "fmt"


func init(){
    fmt.Println("init in wei")
}

func wei(){
    fmt.Println("wei...")
}

 

src/bin/cat  包內有一個文件 cat.go :

package cat
import "fmt"


func init(){
    fmt.Println("init in cat")
}

func miao(){
    fmt.Println("miao miao ...")
}

func SayHello(){
	miao()
}

  

 

  

進入 src/hello 下調試:  

go run *.go

 

編譯生成可執行文件

go install *.go

 

執行結果

init in cat
init in hello
init in wei
main function
Hello, World!
say hi
wei...
miao miao ...

 

  

 

 

to be continued

相關文章
相關標籤/搜索