簡介

平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

    Go是Google開發(fā)的一種 靜態(tài)強類型、編譯型,并發(fā)型,并具有垃圾回收功能的編程語言。為了方便搜索和識別,有時會將其稱為Golang。

    羅伯特·格瑞史莫,羅勃·派克(Rob Pike)及肯·湯普遜于2007年9月開始設(shè)計Go語言,稍后Ian Lance Taylor、Russ Cox加入項目。Go語言是基于Inferno操作系統(tǒng)所開發(fā)的。Go語言于2009年11月正式宣布推出,成為開放源代碼項目,并在Linux及Mac OS X平臺上進行了實現(xiàn),后來追加了Windows系統(tǒng)下的實現(xiàn)。在2012年早些時候發(fā)布了Go 1穩(wěn)定版本。

    現(xiàn)在Go的開發(fā)已經(jīng)是完全開放的,并且擁有一個活躍的社區(qū)。

 

    Go語言的語法接近C語言,但對于變量的聲明有所不同。Go語言支持垃圾回收功能。Go語言的并行模型是以東尼·霍爾的通信順序進程(CSP)為基礎(chǔ),采取類似模型的其他語言包括Occam和Limbo,但它也具有Pi運算的特征,比如通道傳輸。在1.8版本中開放插件(Plugin)的支持,這意味著現(xiàn)在能從Go語言中動態(tài)加載部分函數(shù)。

    與C++相比,Go語言并不包括如異常處理、繼承、泛型、斷言、虛函數(shù)等功能,但增加了 Slice 型、并發(fā)、管道、垃圾回收、接口(Interface)等特性的語言級支持。Google 目前仍正在討論是否應(yīng)該支持泛型,其態(tài)度還是很開放的,但在該語言的常見問題列表中,對于斷言的存在,則持負(fù)面態(tài)度,同時也為自己不提供類型繼承來辯護。

    不同于Java,Go語言內(nèi)嵌了關(guān)聯(lián)數(shù)組(也稱為哈希表(Hashes)或字典(Dictionaries)),就像字符串類型一樣。

 

語言特性

1. 垃圾回收

  1. 內(nèi)存自動回收,再也不需要開發(fā)人員管理內(nèi)存 

  2. 只需要new分配內(nèi)存,不需要釋放

2. 天然并發(fā)

  1. 從語言層面支持并發(fā),非常簡單

  2. Goroutine,輕量級線程,創(chuàng)建成千上萬個Goroutine成為可能

  3. 基于CSP(Communicating Sequential Process)模型實現(xiàn)

3. channel

  1. 管道,類似unix/linux中的pipe

  2. 多個Goroutine之間通過channel進行通信

  3. 支持任何類型

  4. close 內(nèi)置函數(shù)用來關(guān)閉 channel

4. Goroutine

    Go語言的主要的功能在于令人簡易使用的并行設(shè)計,這個方法叫做Goroutine,通過Goroutine能夠讓你的程序以異步的方式運行,而不需要擔(dān)心一個函數(shù)導(dǎo)致程序中斷,因此Go語言也非常地適合網(wǎng)絡(luò)服務(wù)。

    Goroutine是類似線程的概念(但Goroutine并不是線程)。線程屬于系統(tǒng)層面,通常來說創(chuàng)建一個新的線程會消耗較多的資源且管理不易。而 Goroutine就像輕量級的線程,但我們稱其為并發(fā),一個Go程序可以運行超過數(shù)萬個 Goroutine,并且這些性能都是原生級的,隨時都能夠關(guān)閉、結(jié)束。一個核心里面可以有多個Goroutine,通過GOMAXPROCS參數(shù)你能夠限制Gorotuine可以占用幾個系統(tǒng)線程來避免失控。

    在內(nèi)置的官方包中也不時能夠看見Goroutine的應(yīng)用,像是net/http中用來監(jiān)聽網(wǎng)絡(luò)服務(wù)的函數(shù)實際上是創(chuàng)建一個不斷運行循環(huán)的Goroutine。

 

編譯器

    當(dāng)前有兩個Go語言的編譯器的分支。官方編譯器gc和gccgo。官方編譯器在初期使用C寫成,后用go重寫從而實現(xiàn)自舉。Gccgo是一個使用標(biāo)準(zhǔn)GCC作為后端的Go編譯器。

    官方編譯器支持跨平臺編譯(但不支持CGO),允許將源碼編譯為可在目標(biāo)系統(tǒng)、架構(gòu)上執(zhí)行的二進制文件。

 

安裝

下載地址:https://golang.org/dl/

設(shè)置環(huán)境變量:

  1. export GOROOT=$PATH:/path/to/go/

  2. export PATH=$PATH:$GOROOT/bin/

  3. export GOPATH=/home/user/project/go

終端測試:

  1. go version

  2. go env

  3. Gofmt -w *.go

IDE安裝可參考:

  1. http://www.cnblogs.com/zsy/archive/2016/02/28/5223957.html

 

go 標(biāo)準(zhǔn)命令

go build

go build 命令用于編譯我們指定的源碼文件或代碼包以及它們的依賴包

go build -o bin/tongbupan go_dev/tongbupan/main   -o :指定編譯后存放目錄以及名稱

go install

go install用于編譯并安裝指定的代碼包及它們的依賴包。

go get

go get可以根據(jù)要求和實際情況從互聯(lián)網(wǎng)上下載或更新指定的代碼包及其依賴包,并對它們進行編譯和安裝。

go clean

go clean命令會刪除掉執(zhí)行其它命令時產(chǎn)生的一些文件和目錄

go doc & godoc

go doc命令可以打印附于Go語言程序?qū)嶓w上的文檔。我們可以通過把程序?qū)嶓w的標(biāo)識符作為該命令的參數(shù)來達到查看其文檔的目的。

godoc是一個很強大的工具,同樣用于展示指定代碼包的文檔。

go run

go run命令可以編譯并運行命令源碼文件。

go run src/go_dev/hello.go
標(biāo)記名稱標(biāo)記描述
-a強行對所有涉及到的代碼包(包含標(biāo)準(zhǔn)庫中的代碼包)進行重新構(gòu)建,即使它們已經(jīng)是最新的了。
-n打印編譯期間所用到的其它命令,但是并不真正執(zhí)行它們。
-p n指定編譯過程中執(zhí)行各任務(wù)的并行數(shù)量(確切地說應(yīng)該是并發(fā)數(shù)量)。在默認(rèn)情況下,該數(shù)量等于CPU的邏輯核數(shù)。但是在darwin/arm平臺(即iPhone和iPad所用的平臺)下,該數(shù)量默認(rèn)是1。
-race開啟競態(tài)條件的檢測。不過此標(biāo)記目前僅在linux/amd64、freebsd/amd64、darwin/amd64windows/amd64平臺下受到支持。
-v打印出那些被編譯的代碼包的名字。
-work打印出編譯時生成的臨時工作目錄的路徑,并在編譯結(jié)束時保留它。在默認(rèn)情況下,編譯結(jié)束時會刪除該目錄。
-x打印編譯期間所用到的其它命令。注意它與-n標(biāo)記的區(qū)別。

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語言源碼中靜態(tài)錯誤的簡單工具。

go vet命令是go tool vet命令的簡單封裝。

go tool pprof

go tool pprof命令來交互式的訪問概要文件的內(nèi)容。

go tool cgo

可以使我們創(chuàng)建能夠調(diào)用C語言代碼的Go語言源碼文件。

go env

go env用于打印Go語言的環(huán)境信息。

名稱說明
CGO_ENABLED指明cgo工具是否可用的標(biāo)識。
GOARCH程序構(gòu)建環(huán)境的目標(biāo)計算架構(gòu)。
GOBIN存放可執(zhí)行文件的目錄的絕對路徑。
GOCHAR程序構(gòu)建環(huán)境的目標(biāo)計算架構(gòu)的單字符標(biāo)識。
GOEXE可執(zhí)行文件的后綴。
GOHOSTARCH程序運行環(huán)境的目標(biāo)計算架構(gòu)。
GOOS程序構(gòu)建環(huán)境的目標(biāo)操作系統(tǒng)。
GOHOSTOS程序運行環(huán)境的目標(biāo)操作系統(tǒng)。
GOPATH工作區(qū)目錄的絕對路徑。
GORACE用于數(shù)據(jù)競爭檢測的相關(guān)選項。
GOROOTGo語言的安裝目錄的絕對路徑。
GOTOOLDIRGo工具目錄的絕對路徑。

 

 

Hello World 

平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

package main import "fmt" func main() {     fmt.Println("Hello World") }

平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

  

程序基本語法

  1. 所有g(shù)o源碼以.go結(jié)尾;

  2. 注釋不會被編譯,單行注釋是以 // 開頭,多行注釋以 /* 開頭,以 */ 結(jié)尾;

  3. 標(biāo)識符以字母或下劃線開頭,大小寫敏感,_ 是特殊標(biāo)識符,用來忽略結(jié)果;

  4. 保留關(guān)鍵字:

breakdefaultfuncinterfaceselect
casedefergomapstruct
chanelsegotopackageswitch
constfallthroughifrangetype
continueforimportreturnvar
appendboolbytecapclosecomplexcomplex64complex128uint16
copyfalsefloat32float64imagintint8int16uint32
int32int64iotalenmakenewnilpanicuint64
printprintlnrealrecoverstringtrueuintuint8uintptr

 

 

程序基本結(jié)構(gòu)

1. 任何一個代碼文件隸屬于一個包

2. golang可執(zhí)行程序,package main,并且有且只有一個main入口函數(shù)

3. 包中函數(shù)調(diào)用:

  1. 同一個包中函數(shù),直接調(diào)用

  2. 不同包中函數(shù),通過包名+點+函數(shù)名進行調(diào)用

4. 包訪問控制規(guī)則:

  1. 大寫意味著這個函數(shù)/變量是可導(dǎo)出的

  2. 小寫意味著這個函數(shù)/變量是私有的,包外部不能訪問

 

項目目錄

平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

$ 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 靜態(tài)文件

平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

 

簡單栗子

平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

$ tree project project ├── bin │   └── goroute_example ├── pkg ├── src │   └── go_dev │       └── test1 │           └── goroute_example │               ├── goroute │               │   └── add.go │               └── main │                   └── main.go └── vender

平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

[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) }

平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

[add.go] package goroute func Add(pipe chan int, a int, b int) {     pipe <- (a + b) }

平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

$ go build -o bin/goroute_example go_dev/test1/goroute_example/main $ bin/goroute_example  30 $

http://www.cnblogs.com/suoning/p/7154316.html