基礎部分僅僅列舉和其餘語言不同的地方(C語言爲例)。express
Go語言有四個主要聲明:var、const、type、func,相似於C語言中的變量,常量,結構體和函數。性能優化
package main //代表文件屬於哪一個包 import "fmt" const boilingF = 212.0 //包級別聲明,相似於全局變量 func main() { var f = bologna //局部變量 var c = (f-32)*5/9 fmt.Printf("boiling point = %gF or %gC\n",f,c) }
通用形式:var name type = expression,type和expression可省略一個。類型省略,由expression決定;表達式省略初始值對應零值。Go語言不存在未初始化的變量。 模塊化
var b,f,s=true,2.3,"four" //多類型聲明
短變量形式:name:=expression,類型由expression決定,僅僅初始化一個新的變量才能用,一樣能夠聲明多個變量如: i,j:=0,1 僅僅對可讀性有幫助的時候才用這種形式。函數
指針的概念和訪問符號和C語言同樣,只是定義時候不同而已。工具
定義:*type性能
指針類型的零值是nil。優化
用法:new(T),建立一個T類型變量,初始化,並返回其地址。spa
go語言裏new不是一個關鍵字,能夠重定義爲另外的其餘類型。若是使用new做爲自定義變量名字,那麼這個變量做用域內new函數就不能用了。指針
生命週期概念不在介紹,咱們知道變量生命週期能夠根據它所分配的空間來定。可是go語言編譯器選擇使用堆或棧上的空間不是基於使用var或new關鍵字的。看個例子:blog
var global *int func f(){ var x int x = 1 global = &x }
func g(){
y:=new(int)
*y=1
}
按照C語言習慣,局部變量使用的是棧空間,但這裏x必定使用堆空間,由於它在f函數返回以後還能夠經過global訪問,這種狀況咱們稱x從f逃逸。g函數返回後,y就不可訪問了,可被回收,即使使用new,編譯器也會在棧上分配*y。
垃圾回收對於寫出正確程序有巨大幫助,可是變量的生命週期是寫出高效程序所必須的。記住它在性能優化時候是有好處的,由於每一次變量逃逸都須要一次額外的內存分配過程。
go語言支持多重賦值。在實際更新變量前,右邊全部的表達式被推演(即被計算出來),當變量同時出如今賦值符兩側時候特別有用。
交換兩個變量的值 x,y=y,x
可是獨立語句更易讀。
由於go語言函數支持多返回值,因此能夠將不須要的值賦給空標識符 _,err = x.(T)
用法:type name underlying-type
至關於C++的typedef關鍵字。
包的做用和其餘語言中的庫或模塊做用相似,用於支持模塊化、封裝、編譯隔離和重用。gopl.io/ch1/helloworld包文件存儲在目錄$GOPATH/src/gopl.io/ch1/helloworld中。
每個包給他的聲明提供獨立的命名空間。
包讓咱們能夠經過控制變量在包外面的可見性或導出狀況來隱藏信息;管理標識符是否對外可見規則:導出標識符以大寫字母開頭。
導出的包級別的聲明在同一個包的全部文件中可見,由於包級別的常量名字以大寫字母開頭,可使用packag.name來訪問。
package聲明前面緊挨着文檔註釋對整個包進行描述。
go語言中每個包經過import來導入。語言的規範沒有定義從哪來以及含義,這依賴於工具來解釋。導入聲明能夠給導入的包一個短名字,用來在整個文件中引用包的名字。
若是導入一個沒有被引用的包,就會觸發錯誤!!
包的初始化從初始化包級別變量開始,在依賴已解析完畢的狀況下,根據依賴的順序進行。
var a = b+c //最後初始化a var b = f() //而後初始化b var c = 1 //首先初始化 func f() int { return c+1 }
若是包由多個文件組成,初始化按照編譯器收到的文件順序進行:go工具會在調用編譯器前將.go文件進行排序。