一、 Go支持內置的map類型。
二、Go支持數組切片(Slice)。
三、函數有多個返回值,
func getName(){firstName,middleName,lastName,nickName string}{
return "May", "M","Chen","Babe"
}
由於返回值都已經有名字,所以各個返回值也能夠用以下方式來在不一樣的位置進行賦值,從
而提供了極大的靈活性:
func getName()(firstName, middleName, lastName, nickName string){
firstName = "May"
middleName = "M"
lastName = "Chen"
nickName = "Babe"
return
}
並非每個返回值都必須賦值,沒有被明確賦值的返回值將保持默認的空值。而函數的調
用相比C/C++語言要簡化不少:
fn, mn, ln, nn := getName()
若是開發者只對該函數其中的某幾個返回值感興趣的話,也能夠直接用下劃線做爲佔位符來
忽略其餘不關心的返回值。下面的調用表示調用者只但願接收lastName的值,這樣能夠避免聲
明徹底沒用的變量:
_, _, lastName, _ := getName()編程
四、Go有三個關鍵字用於標準的錯誤處理流程,分別爲defer、panic、recover
五、Go不支持繼承和重載,而只是支持了基本的類型組合功能。
六、Go語言引入了goroutine的概念,它使得併發編程變得很是簡單。經過使用goroutine而不是用操做系統的併發機制,經及使用消息傳遞來共享內存而不是使用共享內存來通訊,GO語言讓併發編程變得更加輕盈和安全,經過使用關鍵字go,可讓函數以goroutine方法執行!goroutine是一種比線程更加輕盈、更省資源的協程。Go語言經過系統的線程來多路派遣這些函數的執行,使得每一個Go關鍵字的執行函數能夠運行成爲一個單位協程。當一個協和阻塞時,調度器就會自動把其它協程安排到另外的線程中去執行,從而實現了程序無等待並行化的運行,而調度的開銷很是小。
七、Go語言實現 了CSP(通訊順序進程)模型做爲goroutine間的推薦通訊方式。在CSP模型中,一個併發系統由若干並行運行的順序進程組成,每一個進程不能對其它進程的變量賦值。
八、一個進程內建立的全部goroutine運行在同一個內存地址空間中,所以若是不一樣的goroutine不得不去訪問共享的內存變量,訪問前應該先獲取相應的讀寫鎖。Go語言標準庫中的sync包提供了完備的讀寫鎖功能。
九、Go語言的反射實現了反射的大部分功能,反射能夠得到對象類型的詳細信息,並可動態操做對象。但沒有像Java語言那樣內置類型工廠,故而沒法作到像Java那樣經過類型字符串建立對象實例。
十、Go語言的main()函數不能帶參數,也不能定義返回值,命令行傳入的參數在os.Args變量中保存。若是須要支持命令行開關,可以使用flag包來作命令行參數規範的定義。
十一、Go函數的定義以關鍵字func開頭,一個常規的函數定義包含如下部分:
func 函數名(參數列表)(返回值列表) {
// 函數體
}
對應的一個實例以下:
func Compute(value1 int, value2 float64)(result float64, err error) {
// 函數體
}
Go支持多個返回值,以上示例函數Compute()返回了兩個值,一個叫result,另外一個是err。並非全部返回值都必須賦值。在函數返回時沒有被明確賦值都會被置爲默認值,好比result會被設爲0.0,err會被設爲nil。
十二、變量聲明
Go語言的變量聲明方式與C和C++語言有明顯不一樣。對於變量聲明,Go語言引入了關鍵字var,而類型信息放在變量名以後,示例以下:
Var v1 int
Var v2 string
Var v3 [10] int //數組
Var v4 [] int //數組切片
Var v5 struct {
f int
}
Var v6 *int //指針
Var v7 map[string] int //map, key 爲string 類型,value爲int類型
Var v8 func(a int) int
變量聲明語句不須要使用分號做爲結束符。
Var關鍵字的另外一種用法 是能夠將若干個須要聲明的變量放置在一塊兒,省得須要重複寫var關鍵字,以下所示:
Var (
v1 int
v2 string
)
1三、變量初始化
var v1 int = 10
var v2 = 10
v3 := 10 //編譯器能夠自動推導出v3的類型
Go支持多重賦值
i, j = j, I
1四、常量定義
經過const關鍵字,能夠給字面常量指定一個友好的名字:
const Pi float64 = 3.1415
const zero = 0.0 //無類型浮點常量
const {
size int64 = 1024
eof = -1 //無類型整型常量
}
Const u, v float32 = 0, 3 //u = 0.0, v = 3.0 常量的多重賦值
Const a, b, c = 3, 4, "foo"
Go的常量定義能夠限定常量類型,但不是必需的。若是定義常量時沒有指定類型,那麼它與字面常量同樣,是無類型的常量。
1五、預約義常量
Go預約義了這些常量: true、false和iota。
iota比較特殊,能夠被認爲是一個能夠被編譯器修改的常量,在每個const關鍵字出現時被重置爲0,而後在下一個const出現以前,每出現一次iota,其所表明的數字會自動增1。例如:
Const ( // iota被重置爲0
c0 = iota // c0 == 0
c1 = iota // c1 == 1
c2 = iota // c2 == 2數組
Const (
a = 1 << iota // a == 1 , iota在每個const開頭被重設爲0
b = 1 << iota // b == 2
c = 1 << iota // c == 4
)
若是兩個const的賦值語句的表達式是同樣的,那麼能夠省略後一個賦值表達式。所以,上面的前兩個const語句可簡寫成:
const ( // iota被重設爲0
c0 = iota // c0 == 0
c1 // c1 == 1
c2 // c2 == 2
)安全
1六、 int和int32在Go語言裏被認爲是兩種不一樣的類型,編譯器不會作自動類型轉換。
var value2 int32
value1 := 64 // value1將會被自動推導爲int類型
value2 = value1 //編譯錯誤併發
1七、 兩個不一樣類型的整型數不能直接比較,好比int8類型的數和int類型的數不能直接比較,可是各類類型的整型變量均可以直接與字面常量進行比較,好比:
var i int32
var j int64
i, j = 1, 2
if i == j { // 編譯錯誤
fmt.Println("i and j are equal.")
}
if i == 1 || j == 2 { // 編譯經過
fmt.Println("i and j are equal.")
}函數
1八、 Go語言定義了兩個類型float32和float64,其中float32等價於C語言的float類型,float64等價於C語言的double類型。
fvalue2 := 12.0 //fvalue2將被自動推導爲float64
浮點數不能用==來判斷是否相等,必須經過如下方式進行 :
import "math"
// p爲用戶自定義的比較精度,好比0.00001
func IsEqual(f1, f2, p float64) bool {
return math.Fdim(f1, f2) < p
}操作系統
1九、channel是go語言在語言級提供的goroutine間的通訊方式。可使用channel在兩個或多個goroutine之間傳遞消息。channel是進程內的通訊方式,所以經過channel傳遞對象的過程和調用函數時的參數傳遞行爲比較一致,好比能夠傳遞指針。命令行
經過在函數 調用前使用關鍵字go,便可讓該函數以goroutine方式執行。goroutine是一種比線程更加輕盈、更加省資源的協程,Go語言是經過系統的線程來多路派遣這些函數的執行,使得每一個用go關鍵字執行的函數能夠運行成爲一個單位協程,當一個協和阻塞時,調度器會自動把其它協程安排到另外的線程中去執行,從而實現了程序無等待並行化運行。線程
20、Go語言不支持構造函數和析構函數,Go語言中沒有虛函數,也沒有vptr。Go語言支持接口(interface)。Go語言中的接口與其它語言最指針
大的區別是它的非侵入性。協程
2一、Go語言中,只要兩個接口擁有相同的方法列表,那麼它們就是等同的,能夠相互賦值。