終於要開始講語法囉~Go Playground 是一個練習 Go 的好地方,以下的範例都會放在 Go Playground 上,可以直接上去跑,或是你想用直接用昨天安裝好的開發環境跑也可以~
小提醒:因為系列文是設計給沒學過 Go 也可以看的,有經驗的 Go developer 建議從 Day8 開始,可以直接開始實作~
學任何語言都是從 Hello World 開始,Go 也不例外,在 Go 中每個程式可以由多個 package 組成,程式會從 main package 中的 func main()
開始執行,寫過 C++/Java 的朋友們應該會覺得很熟悉。
fmt
是內建用來做標準輸入輸出的 package,就像其他語言內建的 library 一樣,直接 import
就可以用了
package main
import "fmt"
func main() {
fmt.Println("Hello World")
// Hello World
}
宣告變數有兩種方式,分別是用 var 指定型別(var a int
),或是讓編譯器自動推斷(b := 10
),也可以一次宣告多個變數。如果沒有指定初始值那就會設為 0,不像 C 沒初始化會跑出奇怪的值,果然是 21 世紀的 C 語言呢
Go 支援的型別有常見的 int、string、bool、rune(字元)、byte、float 等等,想知道所有型別可以參考 A tour of Go
func main() {
var a int
a = 10
b := 10
c, d := 1.5, 2.5
var e int
fmt.Println("a + b =", a+b) // a + b = 20
fmt.Println("c + d =", c+d) // c + d = 4
fmt.Println("e =", e) // e = 0
}
Go 的 function 跟其他語言大同小異,比較不同的是他可以有多個回傳值,也可以被當成變數傳來傳去(這點跟 JavaScript 一樣)。在 Go 如果要組合字串的話通常會用 Printf
,這邊的 %d
是整數的意思,如果對這種語法不太熟可以參考 fmt Printing
func add(a int, b int) int { // 接受兩個 int 作為參數,回傳值也是 int
return a + b
}
func swap(a, b int) (int, int) { // 接受兩個 int 作為參數,回傳值也是兩個 int
return b, a
}
func main() {
a, b := 5, 10
fmt.Println("a + b =", add(a, b)) // a + b = 15
fmt.Printf("a = %d, b = %d\n", a, b) // a = 5, b = 10
swapFn := swap
a, b = swapFn(a, b)
fmt.Printf("a = %d, b = %d\n", a, b) // a = 10, b = 5
}
Go 的 if
也跟其他語言一樣,比較特別的是他可以在判斷前寫一段小敘述
import "math/rand"
func randInt() int {
return rand.Intn(100) // 隨機取得 0 ~ 100 的 int
}
func main() {
a := randInt()
if a%2 == 1 {
fmt.Println("a 是奇數")
}
if b := randInt(); b%2 == 1 {
fmt.Println("b 是奇數")
}
}
在 Go 中沒有 while
,因為 for
可以拿來當 while
用
func main(){
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
fmt.Println(sum) // 45
sum2, i := 0, 0
for i < 10 { // 當成 while 用
sum2 += i
i++
}
fmt.Println(sum) // 45
}
試試看到 Go Playground 上實作一個 func pow(x, n int) int
計算 x 的 n 次方:
func pow(x, n int) int {
// Implement this function
}
func main() {
result := pow(2, 10)
fmt.Println(result) // 2^10 = 1024
}
今天講了變數、function、if/else 跟迴圈,大家都看懂了嗎?有問題的話歡迎在下方留言,沒問題的話明天就要進入更難的 slice、map 跟 struct
因為這個系列文的重點在實作,所以語法部分會講得比較快一點,如果覺得步調太快了也可以交叉看看另外兩位邦友的 Go 教學,他們花比較多篇幅在語法的部份: