函式時go語言中的基礎元件,函式定義如下:
type mytype int
func (p mytype) funcname(q int) (r,s int) 12
3456
1, 關鍵字func用於定義乙個函式2, 函式可以繫結到特定的型別上,這叫做接收者。有接收者的函式被稱作method。3, funcname是你的函式名字4, int型別的變數q作為輸入引數。引數以傳值的方式傳遞。5, 變數r和s是函式的兩個命名返回值。在go的函式中可以返回多個值。如果不想對返回的值命名,可以直接寫(int,int)。 如果只返回乙個值,可以省略圓括號。如果函式是乙個子過程,並且沒有任何返回值,也可以省略這些內容。6, 這是函式體,注意return是乙個語句,所以包裹返回值得括號可以省略。
作用域
var a int = 6 //全域性變數
func main()
func p()
func q()
//輸出67
6
var a int = 6
func main()
func p()
func q()
//輸出65
5
下面乙個例子在p()中呼叫q()
var a int = 6
func main()
func p()
func q()
//輸出
86
多返回值
go乙個非常特別的特性(對編譯語言而言)是函式和方法可以返回多個值,這可以改進一大堆在c程式中糟糕的慣例用法: 修改引數的方式,返回乙個錯誤(例如遇到eof,返回-1),在go中,write函式返回乙個計數值和乙個錯誤
命名返回值
go的函式的返回值或者結果引數可以指定乙個名字,並且像原始變數那樣使用,就像輸入的引數那樣。
如果對其命名,在函式開始時,它會用對應型別的0值初始化。如果函式執行了不帶引數的return語句,結果引數返回。這允許用更少的**幹更多的事。
func max(a, b int) (sum int)
延遲**
假設乙個函式開啟乙個檔案,對其進行若干次讀寫,在這樣的函式中經常有提前返回的地方。如果你這樣做就需要關閉正在工作的檔案描述符。這會產生下面這樣的**
func readwrite() bool
if failurey
file.close()
return
true
}
這裡有許多重複的**。為了解決這些,go有了defer語句,在defer後指定的函式,會在函式退出前呼叫,上面的**可以被改寫成下面這樣:
func readwrite() bool
if failurey
return
true
}
可以將多個函式加入defer列表中。比如下面的**輸出4 3 2 1 0
for i :=0; i <5; i++
延遲的函式按照後進先出(lifo)的順序執行。利用defer甚至可以修改返回值。
func aaa() (n int) ()
return
-1}
注意,上面這個函式返回1而不是-1 go語言學習筆記 函式
go語言的函式定義更像是python和c語言的結合體,並且也有不定引數的傳參以及位址傳參方式,非常強大。下面舉一些例子來詳細說明 無參無返回值函式 func myfunc 有參無返回值函式 func myfunc1 a int b int 如果同樣型別,可以簡寫成以下內容 func myfunc2 ...
Go語言學習筆記 函式
函式 函式是各個語句指令的集合,可以實現指定的功能,可以重複使用 定義 func 函式名 引數名 引數型別 返回值名 返回值型別 func x,y int 10,20 匿名函式自呼叫,在後面加上括號簡單來說就是 閉包 函式 匿名函式 引用環境 func adder func int int defe...
Go語言學習筆記 內建函式
go中的預定義函式 go中的預定義函式 close newpanic complex delete make recover real lenprint imag capcopy printlnclose 用於channel的通訊,使用它來關閉channel delete 用於map中刪除例項 le...