iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 5
1
Software Development

Go Phishing!30 天用 Go 實作 Reverse Proxy 之釣魚大作戰系列 第 5

Day05-Go 語法 I

終於要開始講語法囉~Go Playground 是一個練習 Go 的好地方,以下的範例都會放在 Go Playground 上,可以直接上去跑,或是你想用直接用昨天安裝好的開發環境跑也可以~

小提醒:因為系列文是設計給沒學過 Go 也可以看的,有經驗的 Go developer 建議從 Day8 開始,可以直接開始實作~

Hello World

學任何語言都是從 Hello World 開始,Go 也不例外,在 Go 中每個程式可以由多個 package 組成,程式會從 main package 中的 func main() 開始執行,寫過 C++/Java 的朋友們應該會覺得很熟悉。

fmt 是內建用來做標準輸入輸出的 package,就像其他語言內建的 library 一樣,直接 import 就可以用了

Run

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

Run

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
}

Function

Go 的 function 跟其他語言大同小異,比較不同的是他可以有多個回傳值,也可以被當成變數傳來傳去(這點跟 JavaScript 一樣)。在 Go 如果要組合字串的話通常會用 Printf,這邊的 %d 是整數的意思,如果對這種語法不太熟可以參考 fmt Printing

Run

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 也跟其他語言一樣,比較特別的是他可以在判斷前寫一段小敘述

Run

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

Run

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 教學,他們花比較多篇幅在語法的部份:


上一篇
Day04-架設開發環境
下一篇
Day06-Go 語法 II
系列文
Go Phishing!30 天用 Go 實作 Reverse Proxy 之釣魚大作戰30

尚未有邦友留言

立即登入留言