2014年7月2日 星期三

go語言 教學1 基礎

go 語言被譽為這個世代的C語言,其精神也繼承了c語言的優點,少即多,沒有太多花俏的特性,所用到的關鍵字只有二十五個,跟c語言31個、c++89個比較,顯得相當精簡。並行機制也使得go語言,編寫多線程及網路編程都相當容易!
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.






 
 
 
 
 
 

沒有留言:

張貼留言