藝多不壓身,學習一下最近蠻火的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中程式例外中斷,拋出致命錯誤
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/3642.html
標籤:Go
上一篇:Go 其三 Map與String
下一篇:Golang四舍五入保留兩位小數
