學習的理由
- 簡單
- 編譯快
- 部署,運行簡單
- 很多區塊鏈開源項目使用go語言開發
- 學習應該是碼農的本能
Hello World
package main
import "fmt"
func main() {
fmt.Printf("hello world")
}
hello world的代碼看上去還好,比java簡潔,和python一樣語句不用分號來結束。
變量
var i int = 0
上面是一個最完整的變量聲明語句,這個看着就稍微有點奇怪了,有點像javascript,後面又多了個類型聲明,習慣了java裏類型聲明在前面,或者像javascript,python一樣沒有類型聲明。
不過就如剛纔所說,上面是一個最完整的變量聲明語句,實際還可以這樣聲明使用:
var i = 0
var msg = "hello, world"
嗯,這還差不多,很javascript了。變量的類型由變量的初始化值決定。
還可以更簡單嗎?
i := 0
msg := "hello, world"
嘖嘖,nice!不過注意,這種寫法是聲明變量的同時進行初始化,當已經寫過一個i := 0時,後面就不能再來個i := 1了,因爲這樣表示聲明瞭兩個變量,名字都爲i,:=在這裏是聲明變量且賦值初始化。
再來個驚歎的:
x, y := 1, 2
x, y = y, x
上面的兩個語句做了什麼?第一行是聲明並初始化了兩個整型變量x和y,第二行把x和y的值對調!對調兩個變量的值竟然可以這麼簡單!對比下java的版本:
int x = 1;
int y = 2;
int tmp = x;
x = y;
y = tmp;
條件分支
i := 10
if i < 1 {
fmt.Println("i < 1")
} else if i >= 1 && i < 5 {
fmt.Println("i >= 1 && i < 5")
} else {
fmt.Println("i >= 5")
}
lang := "go"
switch lang {
case "go":
fmt.Println("go is best")
case "java":
fmt.Println("java is best")
case "python":
fmt.Println("python is best")
default:
fmt.Println("go is best")
}
條件分支看起來就差不多了,和java相比省略了括號,別的差不多。
循環
for
for i := 0; i < 5; i++ {
fmt.Println("go語言的for循環長這樣")
}
for循環看起來也差不多,和java相比,少了括號。
range
word := []string{"h", "e", "l", "l", "o"}
for index, char := range word {
fmt.Println(index, char)
}
for _, c := range word {
fmt.Println(c)
}
for i, _ := range word {
fmt.Println(i)
}
for i := range word {
fmt.Println(i)
}
關於range,可以用來遍歷數組,列表,鍵值對,這裏僅以數組爲例說明。
當對數組使用range時,會返回兩個變量,第一個變量是數組的索引,第二個變量是數組對應索引的值。
這和java裏的for … in …有點像,但這個支持取索引,和javascript中的each也挺像。
上面第二個for寫法第一個變量是一個下劃線,表示對index不感興趣,這裏就用下劃線來佔位。
類似,第三個for對value不感興趣,就把value用下劃線來佔位。
第四個for其實效果和第三個for一樣,如果只寫一個變量,默認是index。
while
for {
fmt.Println("go語言很奇葩,沒有while")
}
i := 1
for i <= 5 {
fmt.Printf("%d:go語言很奇葩,沒有while\n", i)
i++
}
i = 1
for true {
if i > 5 && 1 > 0 {
break
}
fmt.Printf("%d:go語言很奇葩,沒有while\n", i)
i++
}
go語言很奇葩,竟然沒有while,上面的三個for分別對應java裏的:
while (true) {
//xxx;
}
while (i <= 5) {
//xxx;
}
while (true) {
if (i > 5 && 1 > 0) {
break;
}
//xxx;
}
結語
go語言的初體驗先到此爲止,語法上確實有它簡單的地方,也有它奇葩的地方,看看,寫寫,跑跑,go語言之路走起。