這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。GO語言在流程中,添加了fallthrough關鍵字。
1. 條件陳述式
- 條件陳述式不需要使用括弧將條件包含起來
- 無論語句體內有幾條語句,花括弧{}都是必須存在的
- 左花括弧 { 必須與 if 或者 else 處於同一行
- 在 if 之後,條件陳述式之前,可以添加變數初始化語句,使用 ; 間隔
- 在有傳回值的函數中,不允許將"最終的"return語句包含在if...else...結構中,否則會編譯失敗。失敗原因在於,GO函數無法找到終止該函數的return語句
這裡好像有點問題,自己測試時候按照例子是不會報編譯錯誤的。 經過測試,GO語言也可以將函數的傳回值作為條件陳述式
2. 選擇語句
結果如下:
有幾點需要注意:
- 左花括弧 { 必須與 switch 處於同一行
- 條件運算式不限制為常量或者整數
- 單個 case 中,可以出現多個結果選項
- 與C的規則相反,GO語言不需要用 break 來明確退出一個case
- 只有在case中明確添加 fallthrough 關鍵字,才會繼續執行緊跟的下一個 case
- 可以不設定 switch 之後的條件運算式,在此種情況下,整個switch結構與多個if...else...的邏輯作用相同
switch之後沒有條件運算式。如果傳入的參數都沒有符合case中的條件,就什麼都不做
3. 迴圈語句 GO的迴圈語句只支援for迴圈,不支援while和do-while。
GO還進一步考慮到無限迴圈的情境,讓開發人員不用寫無聊的for(;;){} 直接簡化為如下寫法:
有幾點需要注意:
- 左花括弧 { 必須與for處於同一行
- 允許在迴圈條件中定義和初始設定變數,但GO不支援以逗號為間隔的多個指派陳述式,必須使用平行賦值的方式來初始化多個變數,不能使用i++, j++,需要使用i, j = i+1, j+1
- 也支援continue和break來控制迴圈,但提供了一個更進階的break,可以選擇中斷哪一個迴圈
4. 跳躍陳述式 GO也支援goto關鍵字
函數 GO語言的函數基本組成為:關鍵字func, 函數名, 參數列表, 傳回值, 函數體和返回語句
1. 函數定義
如果若干個相鄰的參數類型的相同,可以在參數列表中省略前面變數的型別宣告: func Add(a, b int ) (ret int, err error) { } 如果傳回值列表中多個傳回值的類型相同,也可以用同樣的方式合并 如果函數只有一個傳回值,也可以這麼寫: func Add(a, b int) int { }
2. 函數調用 函數調用非常方便,只要事先匯入了該函數所在的包,就可以直接按照如下所示的方式調用函數 import "mymath" c := mymath.Add(1, 2)
在GO語言中,函數支援多重傳回值。利用函數的多重傳回值和錯誤處理機制,可以很容易的寫出優雅美觀的GO代碼。
GO語言中函數名字的大小寫不僅僅是風格,更直接體現了該函數的可見度。對於很多注意美感的程式員,這裡的函數名的首字母大寫可能會讓他們感覺不太適應,如果你改成小寫話,會遇到莫名其妙的編譯錯誤。因為規則: 小寫字母開頭的函數只在本包內可見,大寫字母開頭的函數才能被其他包使用。這個規則也適用於類型和變數的可見度。
3. 不定參數 最早我碰到的不定參數,就是C的printf函數。合適的使用不定參數,可以讓代碼簡單易用,尤其是輸入輸出函數,比如日誌函數等等。
1) 不定參數類型 不定參數是指函數傳入的參數個數為不定數量。要做到這一點,首先要將函數定義為接受不定參數類型: func myfunc(args ...int){ for _, arg := range args{ fmt.println(arg) } }
上述代碼錶示函數myfunc()接受不定數量的參數,這些參數的類型都是int,以下都是可以使用的調用方式: myfunc(2, 3, 4) myfunc(1, 3, 7, 13)
形如 ...type格式的類型只能作為函數的參數類型存在,並且必須是最後一個參數。它是一個文法糖,即這種文法對語言的功能並沒有影響,但是更方便程式員使用。使用文法糖能夠增加程式的可讀性,從而減少程式出錯的機會。
2) 不定參數的傳遞
3) 任意類型的不定參數 如果你希望傳遞的參數是任意類型,可以指定類型為interface()
func Printf(format string, args ...interface{}) {
}
4. 多傳回值 GO語言的函數或者成員的方法可以有多個傳回值,這個特效能夠使我們寫出比其他語言更優雅,更簡潔的代碼。GO語言並不需要強制命名傳回值。
如果調用方調用了一個具有多傳回值的方法,但是卻並不關心其中的某個傳回值,可以簡單的用一個底線 "_"來跳過這個傳回值。比如:
n, _ := f.Read(buf)
5. 匿名函數和閉包 匿名函數是指不需要定義函數名的一種函數實現方式。GO語言支援匿名函數。
在GO裡面,函數可以像普通變數一樣被傳遞或使用。 匿名函數由一個不帶函數名的函式宣告和函數體組成
匿名函數可以直接賦值給一個變數或者直接執行:
閉包略
6. 錯誤處理 錯誤處理是學習任何程式設計語言都需要考慮的一個重要話題。在早期語言中,錯誤處理不是語言規範的一部分,通常只作為一種編程範式的存在。GO語言在此功能上考慮的更為深遠。漂亮的錯誤處理規範是GO語言最大的亮點之一。
1) error介面 GO語言引入了一個關於錯誤處理的標準模式,即error介面。
type error interface { Error() string }
對於大多數函數,如果要返回錯誤,大致上都可以定義為如下模式,將error作為多種傳回值中的最後一個,但這並非是強制要求:
調用時的代碼建議按如下方式處理錯誤情況:
defer() 類似處理當發生異常時要關閉檔案的處理方式。