函數function
-Go函數不支援嵌套、重載、和預設參數
-支援以下特性:
-無需聲明原型、不定長度變參、多傳回值、命名傳回值參數、匿名函數、閉包
-定義函數使用關鍵字func,且最左括号不能另起一行
-函數也可以作為一種類型使用
#func 函數名(參數清單,可為空)(設定可傳回值類型,作為可選部分){}
func A1(a int,b string)(int,string){} //定義傳回的類型
func A2(a ,b,c int)(int,string){} //定義函數值都為int類型
func A3(a int,b string)(int,string){}
##有命名傳回值和不命名傳回值差別:
定義多個參數:可用不定常變參
func main(){
A(1,2,3,4,5,6)
}
func A(a...int){
fmt.Println(a)
值類型傳遞和SLICE傳遞差別:
##函數調用:
函數定義時指出,函數定義時有參數,該變量可稱為函數的形參。形參就像定義在函數體内的局部變量。
但當調用函數,傳遞過來的變量就是函數的實參,函數可以通過兩種方式來傳遞參數:
值傳遞:指在調用函數時将實際參數複制一份傳遞到函數中,這樣在函數中如果對參數進行修改,将不會影響到實際參數。
2. 引用傳遞:是指在調用函數時将實際參數的位址傳遞到函數中,那麼在函數中對參數所進行的修改,将影響到實際參數
不定參數類型:
func myfunc(args ...int){}
egg:
匿名函數:
在Go裡面,函數可以像普通變量一樣被傳遞或使用,Go語言支援随時在代碼裡定義匿名函數,匿名函數由一個不帶函數名的函數聲明和函數體組成。匿名函數的優越性在于可以直接使用函數内的變量,不必申明。
a :=func(){ //函數裡沒有名字
fmt.Println("FUNC A")
a()
func A(){
閉包:閉包是由函數及其相關引用環境組合而成的實體(即:閉包=函數+引用環境)
a :=clousre(10){
fmt.Println(func(1))
fmt.Println(func(2))
func clousre(x int)func(int)int{
return func(y int)int{
return x+y
defer:(調用:先進後出,後進先出原則)
-執行方式類似其他語言中的析構函數,在函數體執行結束後按照調用順序的相反順序逐個執行
-即使函數發生嚴重錯誤也會執行
-支援匿名函數的調用
-常用于資源清理、檔案關閉、鎖解以及記錄時間等操作
-通過與匿名函數配合可在return之後修改函數計算結果
-如果函數體内某個變量作為defer時匿名函數的參數,則在定義defer時即以獲得了拷貝,否則則是引用某個變量的位址
-Go沒有異常機制,但有panic/recover模式來處理錯誤
-Panic可以在任何地方引發,但recover隻有在defer調用的函數中有效
for i :=0;i<3;i++{
defer fmt.Println(i)
defer func(){
fmt.Println(i)}()
##recover案例
package main
import "fmt"
func main() {
A()
B()
C()
func A() {
fmt.Println("func A")
func B() {
defer func() {
if err := recover(); err != nil {
fmt.Println("Recover in B")
}()
panic("func B") //如果隻有這條,執行到這就停止了
func C() {
fmt.Println("func C")
本文轉自 DBAspace 51CTO部落格,原文連結:http://blog.51cto.com/dbaspace/1963217