加 Golang學習 QQ羣共同窗習進步成家立業工做 ^-^ 羣號:96933959html
Go是Google開發的一種 靜態強類型、編譯型,併發型,並具備垃圾回收功能的編程語言。爲了方便搜索和識別,有時會將其稱爲Golang。linux
羅伯特·格瑞史莫,羅勃·派克(Rob Pike)及肯·湯普遜於2007年9月開始設計Go語言,稍後Ian Lance Taylor、Russ Cox加入項目。Go語言是基於Inferno操做系統所開發的。Go語言於2009年11月正式宣佈推出,成爲開放源代碼項目,並在Linux及Mac OS X平臺上進行了實現,後來追加了Windows系統下的實現。在2012年早些時候發佈了Go 1穩定版本。golang
如今Go的開發已是徹底開放的,而且擁有一個活躍的社區。編程
Go語言的語法接近C語言,但對於變量的聲明有所不一樣。Go語言支持垃圾回收功能。Go語言的並行模型是以東尼·霍爾的通訊順序進程(CSP)爲基礎,採起相似模型的其餘語言包括Occam和Limbo,但它也具備Pi運算的特徵,好比通道傳輸。在1.8版本中開放插件(Plugin)的支持,這意味着如今能從Go語言中動態加載部分函數。windows
與C++相比,Go語言並不包括如異常處理、繼承、泛型、斷言、虛函數等功能,但增長了 Slice 型、併發、管道、垃圾回收、接口(Interface)等特性的語言級支持。Google 目前仍正在討論是否應該支持泛型,其態度仍是很開放的,但在該語言的常見問題列表中,對於斷言的存在,則持負面態度,同時也爲本身不提供類型繼承來辯護。後端
不一樣於Java,Go語言內嵌了關聯數組(也稱爲哈希表(Hashes)或字典(Dictionaries)),就像字符串類型同樣。數組
只須要new分配內存,不須要釋放網絡
Goroutine,輕量級線程,建立成千上萬個Goroutine成爲可能架構
基於CSP(Communicating Sequential Process)模型實現併發
多個Goroutine之間經過channel進行通訊
支持任何類型
close 內置函數用來關閉 channel
Go語言的主要的功能在於使人簡易使用的並行設計,這個方法叫作Goroutine,經過Goroutine可以讓你的程序以異步的方式運行,而不須要擔憂一個函數致使程序中斷,所以Go語言也很是地適合網絡服務。
Goroutine是相似線程的概念(但Goroutine並非線程)。線程屬於系統層面,一般來講建立一個新的線程會消耗較多的資源且管理不易。而 Goroutine就像輕量級的線程,但咱們稱其爲併發,一個Go程序能夠運行超過數萬個 Goroutine,而且這些性能都是原生級的,隨時都可以關閉、結束。一個核內心面能夠有多個Goroutine,經過GOMAXPROCS參數你可以限制Gorotuine能夠佔用幾個系統線程來避免失控。
在內置的官方包中也不時可以看見Goroutine的應用,像是net/http中用來監聽網絡服務的函數其實是建立一個不斷運行循環的Goroutine。
當前有兩個Go語言的編譯器的分支。官方編譯器gc和gccgo。官方編譯器在初期使用C寫成,後用go重寫從而實現自舉。Gccgo是一個使用標準GCC做爲後端的Go編譯器。
官方編譯器支持跨平臺編譯(但不支持CGO),容許將源碼編譯爲可在目標系統、架構上執行的二進制文件。
設置環境變量:
終端測試:
IDE安裝可參考:
go build
go build
命令用於編譯咱們指定的源碼文件或代碼包以及它們的依賴包
go build -o bin/tongbupan go_dev/tongbupan/main
-o :指定編譯後存放目錄以及名稱
go install
go install
用於編譯並安裝指定的代碼包及它們的依賴包。
go get
go get
能夠根據要求和實際狀況從互聯網上下載或更新指定的代碼包及其依賴包,並對它們進行編譯和安裝。
go clean
go clean
命令會刪除掉執行其它命令時產生的一些文件和目錄
go doc & godoc
go doc
命令能夠打印附於Go語言程序實體上的文檔。咱們能夠經過把程序實體的標識符做爲該命令的參數來達到查看其文檔的目的。
godoc
是一個很強大的工具,一樣用於展現指定代碼包的文檔。
go run
go run
命令能夠編譯並運行命令源碼文件。
go run src/go_dev/hello.go
標記名稱 | 標記描述 |
---|---|
-a | 強行對全部涉及到的代碼包(包含標準庫中的代碼包)進行從新構建,即便它們已是最新的了。 |
-n | 打印編譯期間所用到的其它命令,可是並不真正執行它們。 |
-p n | 指定編譯過程當中執行各任務的並行數量(確切地說應該是併發數量)。在默認狀況下,該數量等於CPU的邏輯核數。可是在darwin/arm 平臺(即iPhone和iPad所用的平臺)下,該數量默認是1 。 |
-race | 開啓競態條件的檢測。不過此標記目前僅在linux/amd64 、freebsd/amd64 、darwin/amd64 和windows/amd64 平臺下受到支持。 |
-v | 打印出那些被編譯的代碼包的名字。 |
-work | 打印出編譯時生成的臨時工做目錄的路徑,並在編譯結束時保留它。在默認狀況下,編譯結束時會刪除該目錄。 |
-x | 打印編譯期間所用到的其它命令。注意它與-n 標記的區別。 |
go test
go test
命令用於對Go語言編寫的程序進行測試。這種測試是以代碼包爲單位的。
go list
go list
命令的做用是列出指定的代碼包的信息。
go fix與go tool fix
go fix
會把指定代碼包的全部Go語言源碼文件中的舊版本代碼修正爲新版本的代碼。
命令go fix
實際上是命令go tool fix
的簡單封裝。
go vet與go tool vet
go vet
是一個用於檢查Go語言源碼中靜態錯誤的簡單工具。
go vet
命令是go tool vet
命令的簡單封裝。
go tool pprof
go tool pprof
命令來交互式的訪問概要文件的內容。
go tool cgo
可使咱們建立可以調用C語言代碼的Go語言源碼文件。
go env
go env
用於打印Go語言的環境信息。
名稱 | 說明 |
---|---|
CGO_ENABLED | 指明cgo工具是否可用的標識。 |
GOARCH | 程序構建環境的目標計算架構。 |
GOBIN | 存放可執行文件的目錄的絕對路徑。 |
GOCHAR | 程序構建環境的目標計算架構的單字符標識。 |
GOEXE | 可執行文件的後綴。 |
GOHOSTARCH | 程序運行環境的目標計算架構。 |
GOOS | 程序構建環境的目標操做系統。 |
GOHOSTOS | 程序運行環境的目標操做系統。 |
GOPATH | 工做區目錄的絕對路徑。 |
GORACE | 用於數據競爭檢測的相關選項。 |
GOROOT | Go語言的安裝目錄的絕對路徑。 |
GOTOOLDIR | Go工具目錄的絕對路徑。 |
package main import "fmt" func main() { fmt.Println("Hello World") }
break | default | func | interface | select |
case | defer | go | map | struct |
chan | else | goto | package | switch |
const | fallthrough | if | range | type |
continue | for | import | return | var |
append | bool | byte | cap | close | complex | complex64 | complex128 | uint16 |
copy | false | float32 | float64 | imag | int | int8 | int16 | uint32 |
int32 | int64 | iota | len | make | new | nil | panic | uint64 |
println | real | recover | string | true | uint | uint8 | uintptr |
1. 任何一個代碼文件隸屬於一個包
2. golang可執行程序,package main,而且有且只有一個main入口函數
3. 包中函數調用:
4. 包訪問控制規則:
$ tree project
project
├── bin
│ ├── example1
│ └── goroute_example
├── pkg
├── src
│ └── go_dev
│ └── day1
│ ├── example1
│ │ ├── debug
│ │ └── hello.go
│ └── goroute_example
│ ├── goroute
│ │ └── add.go
│ └── main
│ └── main.go
└── vender
Src 源碼文件
Bin 編譯後二進制文件
vender 第三方
pkg 靜態文件
$ tree project
project
├── bin
│ └── goroute_example
├── pkg
├── src
│ └── go_dev
│ └── test1
│ └── goroute_example
│ ├── goroute
│ │ └── add.go
│ └── main
│ └── main.go
└── vender
[main.go] package main import ( "fmt" "go_dev/test1/goroute_example/goroute" ) func main() { pipe := make(chan int, 1) go goroute.Add(pipe, 10, 20) sum := <-pipe fmt.Println(sum) }
[add.go] package goroute func Add(pipe chan int, a int, b int) { pipe <- (a + b) }
$ go build -o bin/goroute_example go_dev/test1/goroute_example/main $ bin/goroute_example 30 $