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 函數:
包的初始化:
包的導入:
導入 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