go語言主要為系統及網路編程而設計, 一些設計要求較為嚴格。導入的模組及聲明的變數,未使用無法通過編譯,go精簡的特性,也導致少了一些新穎好用的特性,如函數式語言的列表推導。
>>> [ x for x in range(20) if x % 2]
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
基本語法
go保留了c語言風格,為讓早已熟悉c style的人,減少學習成本,因此語言跟c很相像
package main import ( "fmt" ) func main() { fmt.Println("Hello World!") }
函數聲明關鍵字func 跟c 一樣需有main()函數做為程式進入點。
main() 表示程式一被執行時,就會被執行的位置
採用了大括號{} 做為程式縮排判定
正確
func main() { fmt.Println("Hello World!") }
錯誤
func main()
{
fmt.Println("Hello World!")
}
golang 編譯時會統一格式輸出
編輯器存檔時,也會調用golang的format,做語法編排修正
因此在golang上難以看到五花八門的寫法
程式語言,只要有地方略有不同,就可能引起爭論,例著名的大括號戰爭或
以空白代替大括號…等。任何一種都有不同人馬爭論著。
go的做法減少了一些爭論點。
go聲明變數的方式為:
var i int // 初始化
var i int = 1 // 初始化並給予初始值
i := 1 // 新的聲明方式,go 能自行推導出變數類型
s := "hi" // string
go 數字類型聲明為
int8 int16 int32 int64 和 uint8 uin16 uin32 uint64 等
改善了c語言長久已來的聲明方式short
int
long
long long
不同位元機器,所代的位元數將有所不同
假如long 為32位元整數 long long 為64 位元,那麼127位元呢?
所以go 的聲明方式 int32 int64 int128 會較為明確
簡單加總例子
func main() { sum := 0 for i := 0; i < 10; i++ { sum += i } fmt.Printf("0 + 2 + 3...9 = %d", sum) }
輸出:
1 + 2 + 3...10 = 45
for 條件式 {
// do something
}
如省略條件式,則變成while一樣的功能
for {
// 無窮迴圈
}
因此go 沒while 和 do...while 一切由for 包辨
有許多語言for 可用來迭代陣列裡的物件
例:
#python
arr = [1, 2, 3]
for i in arr:
print i
或者像c#, php裡的foreach語法
golang裡則是使用
for i, v := range arr {
//do something
}
range arr 會返回二個值 index, value
// example
func main() { s := "I am golang!" arr := []byte(s) fmt.Println(arr) for i, v := range arr { fmt.Println(i, string(v)) } }
[]byte(s) 將字串轉為byte slice
arr 內容
[73 32 97 109 32 103 111 108 97 110 103 33]
所有字元被變成 byte 數字
要顯示為原來英文字,需做轉換
for i, v := range arr {
fmt.Println(i, string(v))
}
range arr 返回值給 i, v 如想省略不用可以使用 _ 符號
_, v 或 i, _
另外需注意的是
var i int
var j int32
同為32位元整數,但是二者之間是無法做運算的,仍需做同類型轉換
func main() { var i int = 100 var j int32 = 100 fmt.Println(i + j) }
編譯警告:
invalid operation: i + j (mismatched types int and int32)
go也不支持隱式轉換,只能顯示轉換完,再做運算
var i int8 = 10
var j int32 = 100
fmt.Println(i + j)
invalid operation: i + j (mismatched types int8 and int32)
fmt.Println(int32(i) + j)
it's ok.
沒有留言:
張貼留言