1. 程式人生 > 實用技巧 >Go之函式與異常

Go之函式與異常


package main

import "fmt"
// import   "strings"

// 函式接收可變引數
// 當多個引數是相同型別時,可以只將資料型別寫在最後一個引數裡面
func intSum(nums ...int)(sum, len int){
	// 可變引數在函式體中是切片型別
	for _, num := range(nums){
		// 當返回值有變數名時,不需要重新宣告
		sum += num
	}
	len = cap(nums)
	// 函式在即將要結束的時候按照逆序的方式,執行被defer修飾的語句,通常用來處理資源的釋放問題
	defer fmt.Println(999)
	defer fmt.Println(998)
	return sum, len
}
func main() {
	// go語言中支援函式、匿名函式和閉包,並且函式
	// 在go語言中屬於“一等公民”	
	sum, len := intSum(1,2)
	fmt.Println(sum, len)

	// 函式是可以作為變數的
	testFunc := intSum
	fmt.Printf("%T\n", testFunc)


	// 匿名函式
	// 匿名函式就是沒有函式名的函式,匿名函式多用於實現回撥函式和閉包
	func(x int){
		fmt.Println(x)
	}(10)

	// 閉包
	// 閉包指的是一個函式與其相關的引用環境組合而成的實體
	// 簡單來說,閉包=函式+引用環境
	// funca 此時就是閉包
	// 判斷函式是不是閉包,就要判斷函式內部有沒有引用外層的作用域的變數
	funca := a()
	funca()

	b()
	// recover()必須搭配defer使用
	// defer一定要在可能引發painc的語句之前定義
}

// 把函式作為返回值
func a() func(){
	name := "古力娜扎"
	return func(){
		fmt.Println(name)
	}
}

func b(){
	// defer註冊
	defer func(){
		// 收集相關錯誤資訊
		err := recover()
		if err != nil{
			fmt.Println("func b err")
		}		
	}()

	// 觸發painc
	panic("painc in b")
}