《寶可夢朱紫》快速刷錢方法視訊教學 怎麼快速刷錢
GO函式
1.1 函式分類
在go語言中,函式是第一類物件,我們可以將函式儲存到變數中。函式主要有具名和匿名之分,包級函式一般都是具名函式,具名函式是匿名函式的一種特例,當匿名函式引用了外部作用域中的變數時就成了閉包函式,閉包函式是函數語言程式設計語言的核心。
舉例程式碼如下:
-
具名函式:就和C語言中的普通函式意義相同,具有函式名,返回值以及函式引數的函式。
func Add(a,b int) int { return a+b }
-
匿名函式:指不需要定義函式名的一種函式實現方式,它由一個不帶函式名的函式宣告和函式體組成。
var Add = func(a, b int) int { return a+b }
解釋幾個名詞如下:
1.閉包函式:返回為函式物件,不僅僅是一個函式物件,在該函式外還包裹了一層作用域,這使得,該函式無論在何處呼叫,優先使用自己外層包裹的作用域。
2.一級物件:支援閉包的多數語言都將函式作為第一級物件,就是說函式可以儲存到變數中作為引數傳遞給其他函式,最重要的是能夠被函式動態建立和返回。
3.包:go的每一個檔案都是屬於一個包的,也就是說go是以包的形式來管理檔案和專案目錄結構的
1.2 函式宣告和定義
GO語言函式定義格式如下:
func function_name([parameter list])[return types]{ 函式體 }
解析 | |
---|---|
func | 函式由func開始宣告 |
function_name | 函式名稱 |
parameter list | 引數列表 |
return_types | 返回型別 |
函式體 | 函式定義的程式碼集合 |
1.3 函式傳參
Go語言中的函式可以有多個引數和多個返回值,引數和返回值都是以傳值的方式和被呼叫者交換資料。在語法上,函式還支援可變數量的引數,可變數量的引數必須是最後出現的引數,可變數量的引數其實是一個切片型別的引數。
當可變引數是一個空介面型別時,呼叫者是否解包可變引數會導致不同的結果,我們解釋一下解包的含義,程式碼如下:
func main(){ var a = []int{1,2,3} Print(a...) // 解包 Print(a) // 未解包 } func Print(a ...int{}){ fmt.Println(a...) }
以上當傳入引數為a...
時即是對切片a進行了解包,此時其實相當於直接呼叫Print(1,2,3)
。當傳入引數直接為 a
時等價於直接呼叫Print([]int{}{1,2,3})
1.4 函式返回值
不僅函式的引數可以有名字,也可以給函式的返回值命名。
舉例程式碼如下:
func Find(m map[int]int,key int)(value int, ok bool){
value,ok = m[key]
return
}
如果返回值命名了,可以通過名字來修改返回值,也可以通過defer語句在return語句之後修改返回值,舉例程式碼如下:
func main(){
for i := 0;i<3;i++{
defer func(){fmt.println(i)}()
}
}
// 該函式最終的輸出為:
// 3
// 3
// 3
以上程式碼中如果沒有defer其實返回值就是0,1,2
,但defer語句會在函式return之後才會執行,也就是或只有以上函式在執行結束return之後才會執行defer語句,而該函式return時的i
值將會達到3,所以最終的defer語句執行printlin的輸出都是3。
defer語句延遲執行的其實是一個匿名函式,因為這個匿名函式捕獲了外部函式的區域性變數v,這種函式我們一般叫閉包。閉包對捕獲的外部變數並不是傳值方式訪問,而是以引用的方式訪問。
這種方式往往會帶來一些問題,修復方法為在每一輪迭代中都為defer函式提供一個獨有的變數,修改程式碼如下:
func main() {
for i := 0; i < 3; i++ {
i := i // 定義一個迴圈體內區域性變數i
defer func(){ println(i) } ()
}
}
func main() {
for i := 0; i < 3; i++ {
// 通過函式傳入i
// defer 語句會馬上對呼叫引數求值
// 不再捕獲,而是直接傳值
defer func(i int){ println(i) } (i)
}
}
1.5 遞迴呼叫(遞迴函式)
Go語言中,函式還可以直接或間接地呼叫自己,也就是支援遞迴呼叫。Go語言函式的遞迴呼叫深度邏輯上沒有限制,函式呼叫的棧是不會出現溢位錯誤的,因為Go語言執行時會根據需要動態地調整函式棧的大小。這部分的知識將會涉及goroutint和動態棧的相關知識。
它的語法和c很相似,格式如下:
func recursion(){
recursion() /* 函式呼叫自身 */
}
func main() {
recursion()
}