Go 起手式之一


Posted by Nacho on 2020-03-28

變數宣告

Go的變數宣告又兩種方式,其中短變數宣告比較特別,由於沒有指明特定型別,因此,Go會依據等號右邊的值來決定變數的型別(參考)。此外,短變數宣告不能寫在函式外面否則會出錯。

// 第一種: 常見的變數宣告
var a int // 沒有指定初始值就會預設為 0
var a int = 1 // 給定初始值 1
// 第二種: 短變數宣告(Short variable declarations)
message := "hello world"

另外是多個變數的宣告(節省空間用)

var b,c int = 2, 3

(補充)宣告後得到空值(Zero values)的情況

var i int     // 印出 0 
var f float64 // 印出 0
var b bool    // 印出 false
var s string  // 印出 ""
fmt.Printf("%v %v %v %q\n", i, f, b, s)

函式

Go的程式是由Package組成的,以先前的 hellow world 例子來說,程式從 main package 開始,接著引入內建的 library ,並在 main() 這個主程式的函式開始執行。

package main

import "fmt"

func main() {
    fmt.Println("Hello World")
}

Go的函式的特色就是能夠接受多個回傳值,另外也能把函式當成變數傳給別人用。

// 帶入兩個參數,但同一種型別的省略寫法
// 當函式只有一個值要回傳時的寫法
func add(x, y int) int {  
    return x + y  
}  

// 當函式有一個以上的值要回傳時的寫法
func swap(x, y string) (string, string) {  
    return y, x  
} 

func main() {  
    fmt.Println(add(42, 13)) 
    // 讓 a 跟 b 告別接收回傳值
    a, b := swap("hello", "world")  
    fmt.Println(a, b)  
}

流程控制

條件判斷: 給一隨機數印出是奇數或偶數

import "math/rand"

func randInt() int {
    return rand.Intn(100)   // 隨機跑出 0 ~ 100 的正整數
}

func main() {
    // 寫法一
    a := randInt() // 將函數指定為 a 的變數
    if a%2 == 1 {
        fmt.Println("a 是奇數")
    }else {
        fmt.Println("a 是偶數")
    }
    // 寫法二(加入短宣告寫法的簡略版)
    if a := randInt(); a%2 == 1 {
        fmt.Println("a 是奇數")
    }else {
        fmt.Println("a 是偶數")
    }
}

迴圈: 印出2的10次方

func pow(x, n int) int {
    result := 1
    // for 迴圈的寫法
    for i := 0; i < n; i++ {
        result *= x
    }
    // Go 沒有while迴圈,因為可以拿 for 來用
    result, i := 1, 0
    for i < n {
        result *= x
        i++
    }
    return result
}

func main() {
    result := pow(2, 10)
    fmt.Println(result) // 1024
}

延遲(Defer): 先印出hello,再印出world

以下的例子來說,defer 會等主函式執行完所有的函式後再回頭做defer 裡的工作。
有什麼用途呢?可以拿來例如釋放資源、停止資料庫連線之類的、調度程式執行的順序
後續會再有更多補充!!!

func main() {
    defer fmt.Println("world")

    fmt.Println("hello")
}

筆記參考

Larry Lu 的2019 iT 邦幫忙鐵人賽
官方文件


#Go Variable #Go Function #Go If/else #Go Loop #Go Defer







Related Posts

[Day 0] 第一屆開發者寫作松

[Day 0] 第一屆開發者寫作松

[16] 值 VS. 參考

[16] 值 VS. 參考

[Day-3] 從電商網站學用戶註冊

[Day-3] 從電商網站學用戶註冊


Comments