Go 其四 函式
阿新 • • 發佈:2020-06-27
藝多不壓身,學習一下最近蠻火的Go語言,整理一下筆記。相關Code和筆記也放到了Git上,傳送門。
函式 -- 一等公民
與其他主要程式語言的差異
- 可以有多個返回值
- 所有引數都是值傳遞: slice, map, channel 會有傳引用的錯覺。以Slice舉例,實際上是一個結構,傳遞過去的是指向具體記憶體的指標的值,所以操作的是同一個空間。看起來就像是傳遞的引用一樣。
- 函式可以作為變數的值 (筆者注:看描述感覺類似於C#中的Delegate)
- 函式可以作為引數或返回值 (筆者注:感覺類似於C#中的Function與Action)
函式 可變引數及延遲執行
可變引數
func sum(ops ... int) int { s := 0 for _, op := range ops { s += op } return s }
延遲執行函式 defer 類似於Finnaly
func TestDefer(t *testing.T){ defer func() { /*這個行內函數直到TestDefer執行完畢,返回前才會執行。 通常用於清 理資源,釋放鎖等功能*/ t.Log("Clear resources") }() t.Log("Started") panic("Fatal error") //defer 仍會執行 //panic是Go中程式異常中斷,丟擲致命錯誤 }
附上程式碼:
package func_test import ( "testing" "math/rand" "time" "fmt" ) // 函式多個返回值 func returnMultiValues() (int, int) { return rand.Intn(10), rand.Intn(20) } func slowFun(op int) int{ time.Sleep(time.Second *1) fmt.Println("In SlowFun, the parameter is", op) return op } // 傳遞一個函式進來 func timeSpent(inner func(op int) int) func(op int) int { return func(n int) int { start := time.Now() ret := inner(n) fmt.Println("time spent:", time.Since(start).Seconds()) return ret } } func TestFn(t *testing.T) { // 函式多個返回值 a, b := returnMultiValues() t.Log(a, b) // 計算函式執行時間 tsSF := timeSpent(slowFun) t.Log(tsSF(10)) } func Sum (ops ... int) int { ret := 0 for _, s := range ops { ret += s } return ret } func TestVarParam(t *testing.T) { t.Log(Sum(1,2,3,4)) t.Log(Sum(5,6,7,8,9)) } func Clear() { fmt.Println("Clear resources in Clear function.") } func TestDefer(t *testing.T){ defer func() { //這個行內函數直到TestDefer執行完畢,返回前才會執行。 通常用於清理資源,釋放鎖等功能 defer Clear() t.Log("Clear resources") }() t.Log("Started") panic("Fatal error") //defer 仍會執行 //panic是Go中程式異常中斷,丟擲致命錯誤 }