這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
什麼是Go?來自於網站:
Go 程式設計語言是一個使得程式員更加有效率的開源項目。Go 是有表達力、簡潔、清晰和有效率的。它的並行機制使其很容易編寫多核和網路應用,而新奇的類型系統允許構建有彈性的模組化程式。Go 編譯到機器碼非常快速,同時具有便利的記憶體回收和強大的運行時反射。它是快速的、靜態類型編譯語言,但是感覺上是動態類型的,解釋型語言。
首先介紹go語言的特性--
- 並行 :Go 讓函數很容易成為非常輕量的線程。這些線程在Go 中被叫做goroutines;
- Channel : 這些goroutines 之間的通訊由channe完成;
- 快速 : 編譯很快,執行也很快。目標是跟C 一樣快。編譯時間用秒計算;
- 安全 :當轉換一個類型到另一個類型的時候需要顯式的轉換並遵循嚴格的規則。Go 有垃圾收集,在Go 中無須free(),語言會處理這一切;
其次介紹go語言中的package,如何擷取一個內建的package資訊。可以通過--go doc fmt、go doc hash。
下面就讓我們進入go世界的hello world~!
1 package hello //如果改成package main就可以2 3 import "fmt"4 5 func main() {6 fmt.Printf("hello world\n")7 }
上面這個程式是無法啟動並執行,原因有三點:
- 所有的Go 檔案以package <something>開頭,對於獨立啟動並執行執行檔案必須是package main;
- 這是說需要將fmt 包加入main。不是main 的其他包都被稱為庫
- package main 必須首先出現,緊跟著是import。在Go 中,package 總是首先出現,然後是import,然後是其他所有內容。當Go 程式在執行的時候,首先調用的函數是main.main(),這是從C 中繼承而來。這裡定義了這個函數;
go語言中單獨一條語句,自動結尾插入分號,但是如果希望一個或者更多的語句放在同一行上,記得在在語句之間加上分號。不然是無法編譯執行的。
1 package main2 import "fmt"3 4 var b int = 105 //b := 10 這種聲明和賦值連在一起的方式是不允許在函數外面使用的6 func main() {7 a := 15 //函數內部可以使用8 fmt.Printf("hello world %d %d\n",a,b)9 }
多個var 聲明可以成組;const 和import 同樣允許這麼做。留意圓括弧的使用:
var (
x int
b bool
)
有相同類型的多個變數同樣可以在一行內完成聲明: var x, y int 讓x 和y 都是int 類型變數。同樣可以使用平行賦值:
a, b := 20, 16
Go 的編譯器對聲明卻未使用的變數在報錯。
Go 有眾所周知的類型如int,這個類型根據你的硬體決定適當的長度。意味著在32 位硬體上,是32 位的;在64 位元硬體上是64 位元的。注意:int 是32 或64 位元之一,不會定義成其他值。uint 情況相同。如果你希望明確其長度,你可以使用int32 或者uint32。完整的整數類型列表(符號和無符號)是int8,int16,int32,int64 和byte,uint8,uint16,uint32,uint64。byte 是uint8 的別名。浮點類型的值有float32 和float64 (沒有float 類型)。64 位元的整數和浮點數總是64 位元的,即便是在32 位的架構上。
枚舉類型--
const (
a = iota //第一個iota 表示為0,因此a 等於0,當iota 再次在新的一行使用時,它的值增加了1,因此b 的值是1。
b = iota
c = iota
)
字串--
字串在Go 中是UTF-8 的由雙引號(”)包裹的字元序列。如果你使用單引號(’)則表示一個字元。
控制語句:
1 if x > 0 { <-- { is mandatory //無需圓括弧,但是if的第一個{必須和if同行2 return y3 } else {4 return x5 }
Go 的for 迴圈有三種形式,只有其中的一種使用分號。
for init; condition; post { } 和C 的for 一樣
for condition { } 和while 一樣
for { } 和C 的for(;;) 一樣(死迴圈)
迴圈嵌套迴圈時,可以在break 後指定標籤。用標籤決定哪個迴圈被終止:J: for j := 0; j < 5; j++ { for i := 0; i < 10; i++ { if i > 5 { break J 現在終止的是j 迴圈,而不是i 的那個 } println(i) }}
1 它不會匹配失敗後自動向下嘗試,但是可以使用fallthrough 使其這樣做。沒 2 有fallthrough: 3 switch i { 4 case 0: // 空的case 體 5 case 1: 6 f() // 當i == 0 時,f 不會被調用! 7 } 8 而這樣: 9 switch i {10 case 0: fallthrough11 case 1:12 f() // 當i == 0 時,f 會被調用!13 }14 用default 可以指定當其他所有分支都不匹配的時候的行為。15 switch i {16 case 0:17 case 1:18 f()19 default:20 g() // 當i 不等於0 或1 時調用21 }