變數宣告
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")
}