Go函式和方法
一、函式
函式是基本的程式碼塊,用於執行一個任務。
go語言至少有個main()函式
1)函式定義
func function_name( [parameter list] ) [return_types] {
函式體
}
func:宣告這是一個函式
function_name:函式名稱,函式名和函式列表一起構成了函式簽名
parameter list:引數列表,
return_types:返回型別,不是必須的,當沒有返回值時,可以不指定返回型別,也可以返回多個值,如(string,string)
函式體:函式定義的程式碼集合
常用函式用法:
// 函式多參無返回值 func func_name(a,b int, c string){} // 函式無參無返回值 func func_name(){} // 單個返回值 func func_name(s string) string{} // 多個返回值 func func_name (s string) (string,int){} // 命名返回引數 func func_name(s string) (result string){ ... result=1 return } // 可變引數,可變引數只能做為函式引數存在,並且是最後一個引數 func func_name(s string,args ...int){} // 匿名函式,呼叫:f(1,2) f := func(x,y int) int { return x + y }
2)函式引數
函式如果使用引數,該變數可稱為函式的形參。
形參就像定義在函式體內的區域性變數。
呼叫函式,可以通過兩種方式來傳遞引數:
傳遞型別 | 描述 |
---|---|
值傳遞 | 值傳遞是指在呼叫函式時將實際引數複製一份傳遞到函式中,這樣在函式中如果對引數進行修改,將不會影響到實際引數。 |
引用傳遞 | 引用傳遞是指在呼叫函式時將實際引數的地址傳遞到函式中,那麼在函式中對引數所進行的修改,將影響到實際引數。 |
預設情況下,Go 語言使用的是值傳遞,即在呼叫過程中不會影響到實際引數
3)遞迴函式
遞迴,就是在執行的過程中呼叫自己
Go語言支援遞迴,注意在使用遞迴時,要設定退出條件,避免陷入死迴圈
func recursion() { recursion() /* 函式呼叫自身 */ } func main() { recursion() }
4)defer
Go語言的 defer 語句會將其後面跟隨的語句進行延遲處理
在 defer 歸屬的函式即將返回時,將延遲處理的語句按 defer 的逆序進行執行,也就是說,先被 defer 的語句最後被執行,最後被 defer 的語句,最先被執行。
關鍵字 defer 的用法類似於面向物件程式語言 Java 和 C# 的 finally 語句塊,它一般用於釋放某些已分配的資源,典型的例子就是對一個互斥解鎖,或者關閉一個檔案
defer關鍵字特性:
1. 關鍵字 defer 用於註冊延遲呼叫。
2. 這些呼叫直到 return 前才被執。因此,可以用來做資源清理。
3. 多個defer語句,按先進後出的方式執行。
4. defer語句中的變數,在defer宣告時就決定了
defer用途:
1. 關閉檔案控制代碼
2. 鎖資源釋放
3. 資料庫連線釋放
5)init函式和mian函式
①:init函式
go語言中init函式用於包(package)的初始化,該函式是go語言的一個重要特性
init函式是用於程式執行前做包的初始化的函式,比如初始化包裡的變數等
每個包可以擁有多個init函式,包的每個原始檔也可以擁有多個init函式
對同一個go檔案的init()呼叫順序是從上到下的。
對同一個包中不同檔案是按檔名字串比較“從小到大”順序呼叫各檔案中的init()函式
不同包的init函式按照包匯入的依賴關係決定該初始化函式的執行順序
init函式不能被其他函式呼叫,而是在main函式執行之前,自動被呼叫
②:main函式
Go語言程式的預設入口函式(主函式)
func main(){
//函式體
}
6)函式表示式
使用函式表示式實現三目運算
// 函式表示式,實現三目運算 // 格式:func() returnType {...}() i := 1 j := 2 k := func() int { if i > j { return i } return j }() fmt.Println(k)
帶引數的函式表示式:
h := func(a, b int) int { if a > b { return a } return b }(i, j)
二、方法