go語言中fn具體指的是關鍵字func,函數的基本組成是:關鍵字func、函數名、參數列表、回傳值、函數體和回傳語句,每個程式包含很多的函數,函數是基本的程式碼區塊,函數是組織好的、可重複使用的、用來實現單一或相關聯功能的程式碼段。
本教學作業系統:Windows10系統、GO1.20版、Dell G3電腦
Go語言函數宣告(函數定義)
函數是組織好的、可重複使用的、用來實現單一或相關聯功能的程式碼段,其可以提高應用的模組性和程式碼的重複使用率。 Go 語言支援普通函數、匿名函數和閉包,從設計上對函數進行了最佳化和改進,讓函數使用起來更加方便。
函數構成了程式碼執行的邏輯結構,在Go語言中,函數的基本組成是:關鍵字func、函數名、參數列表、回傳值、函數體和回傳語句,每一個程式都包含很多的函數,函數是基本的程式碼區塊。
因為Go語言是編譯型語言,所以函數寫的順序是無關緊要的,鑑於可讀性的需求,最好把main() 函數寫在檔案的前面,其他函數依照一定邏輯順序進行編寫(例如函數被呼叫的順序)。
編寫多個函數的主要目的是將一個需要很多行程式碼的複雜問題分解為一系列簡單的任務來解決,而且,同一個任務(函數)可以被多次調用,有助於程式碼重用(事實上,好的程式是非常注意DRY 原則的,即不要重複你自己(Don't Repeat Yourself),意思是執行特定任務的程式碼只能在程式裡面出現一次)。
當函數執行到程式碼區塊最後一行}之前或return 語句的時候會退出,其中return語句可以帶有零個或多個參數,這些參數將作為傳回值供呼叫者使用,簡單的return語句也可以用來結束for的死循環,或是結束一個協程(goroutine)。
Go語言函數不需要宣告
Go語言的函數是一等公民,和變數一樣,可以賦值給某一變數(匿名函數產生的原因)
由於函數是一等公民, 所以以前定義變數所有的格式, 都可以用來定義函數型別的變數
var 变量名称 函数类型 var 变量名称 函数类型 = 匿名函数 var 变量名称 = 匿名函数 变量名称 := 匿名函数 var( var 变量名称 = 匿名函数 )
fn = func (a,b int){ return a + b } fn()
Go語言中函數變數定義的方式和C語言不一樣
格式: func函數名稱( 形參列表) 傳回值列表{}
Go語言中函數傳回值可以不只一個
func test(a,b int) (a,b int){ return a,b }
Go語言函數傳回值可以只寫入型別,也可以寫變數型別
只寫型別:func test(a,b int) (int){} 注意:只寫型別,傳回值型別int兩邊的括號可以省略
#變數加上型別:func test(a,b int) (a,b int){}
注意點:當寫變數型別的形式時,return可以不加回傳值,會自動尋找程式碼區塊的a和b
func test(a,b int) (a,b int){ a = 100 b = 99 return //自动返回100,99}
Go語言形參列表或返回值列表的類型如果相同,那麼我們可以連續定義
如下:兩個函數表示同一種方法
func test(a,b int) (a,b int){return a,b} func test2(a int,b int) (int,int){return a,b}
由於Go語言函數可以有多個回傳值,那麼外界接收函數多個回傳值的時候需要用多個變數來接收,但是Go語言中變數不使用會報錯,所以我們如果有一個回傳值不需要使用時,我們會用_ 來接收, _ 在Go語言中有特定的意義,所以不能用作變數的識別符
#匿名函數
匿名函數就是沒有名稱的函數,定義後需要立即使用否則會報錯
匿名函數通常情況只用做一次,由於是一等公民,可以作為函數的形參或者作為函數的返回值
#作為函數的形參
fn := func (a,b int) int { return a + b } //此时调用test函数用来计算a+b可以这么写 res := test(a,b,fn) func test(a,b int,method func(int,int) int) func() { return method(a,b) }
進一步演變
由於fn和是匿名函數賦值,所以我們可以直接將匿名函數傳入test
//此时调用test函数用来计算a+b可以这么写 res := test(a,b,func (a,b int) int { return a + b }) func test(a,b int,method func(int,int) int) func() { return method(a,b) }
作為函數的回傳值
fn := test() fn()//打印匿名函数 func test() func() { return func() { fmt.Println("匿名函数") } }
閉包(特殊的匿名函數)
返回的匿名函數中如果用到了外界的變數,那麼就稱為閉包
閉包的特點:"人在塔在"只要返回的匿名函數中用到了外界的變數,那麼如果函數呼叫後還有使用到此匿名函數的情況,那麼函數棧不會釋放,一旦不再使用,函數棧才釋放
fn := test()//test函数也被称为迭代器 fn() //2 fn() //3 fn() //4 func test() func(){ x := 1 return func (){ x++ println(x) } }
匿名函數的記憶體表現
圖解
#程式碼區存放了三個函數的程式碼,對應有一個位址
定義變數fn,將匿名函數的位址傳給了fn
#呼叫函數test開闢儲存空間
為num,value,method,res開啟儲存空間,其中method保存傳給它的函數的位址
執行函數,method保存了匿名函數的位址,執行method的時候開闢了存儲空間,存放了a和b的值,函數結束後將值返回給res,並釋放了method的存儲空間
印了res,test的函數也被釋放,fn使用完畢也被釋放
以上是go語言中fn是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!