[go語言]函數
來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。1 Go函數介紹
go函數不支援重載,預設參數。支援:
無需聲明原型
不定長變參
多傳回值
命名傳回值參數
匿名函數
閉包
2 函數定義
1)函數定義方式如下
func 函數名(參數名 參數類型))(返回參數名 返回參數類型){
函數語句
return 傳回值
}
2)返回多個值
函數傳回值可以是多個值,比如:
func sum(x int ,y int ) (s int,err error){
return x+y,nil
}
可省略傳回值名稱,只保留傳回型別。
3)命名返回參數
當返回參數有著變數名,return後面可以不接變數。傳回值預設為返回參數變數的值。
例如
func sum(x int, y int) (s int, err error) {
s = x + y
err = nil
return
}
2 可變參數
Go函數支援變參。最後一位參數可以有著不定數量的同類型變數的參數。使用...表示
變參參數實際上傳進來一個slice,必須進行range擷取單個參數。比如
func sum(arg ...int)(s int,err error){
}
調用可變參數時,傳入一個資料結構,可以調用這個資料結構的全部,或者調用這個資料結構的切片。
例如:
全部調用 myfunc2(arg...);
調用片段 myfunc2(arg[:2]...);
3 引用傳遞與值傳遞
1)參數為基礎資料型別 (Elementary Data Type)(值傳遞),此時預設傳遞的是拷貝。(數群組類型預設傳遞副本)
go語言參數傳遞的是參數的副本。對於普通類型相當於參數是變數的拷貝。
在函數中的操作等對原來的變數都是沒有影響的。如果要在函數中修改影響傳進來的值,則必須進行取地址作為參數傳遞。
2)參數為自訂類型(值傳遞)
傳遞方式同上。
3)參數為資料結構(拷貝傳遞),此時預設傳遞的是拷貝
Go語言中string,slice,map這三種類型的實現機制類似指標,相當於引用傳遞。
在函數對變數修改都會影響原來的變數。
4)數群組類型預設是值傳遞
如果資料結構比較大的話,建議傳遞指標。否則傳遞數組參數需要複製,佔用較多記憶體和時間。
4 函數作為值
1)函數作為值是指將一個函數名作為變數值一樣傳遞
首先可以聲明一個函數類型,根據函數類型可以建立一個值(函數名)。
擁有相同參數和相同傳回值的函數屬於同一個函數類型,但是不同函數名的函數代表不同的函數值。
2)函數名作為值,函數名可以作為參數變數(參數或者返回參數,也可以放在類型對象中)傳遞。
聲明如下:
函數名可以作為一個實值型別,通過參數傳遞。
代碼如下:
type AddX func(int) int //定義一個func(int)的函數類型的別名
func Add3(x int) int {
return x + 3
}
func Add5(x int) int {
return x + 5
}
func doAll(x int, f1 AddX, f2 AddX) int {
return f2(f1(x))
}
func main() {
sum := doAll(1, Add3, Add5)
fmt.Println("sum:=========", sum)
}
也可以不定義類型,代碼如下:
//不定義函數類型別名,直接用func(int)int
func Add3(x int) int {
return x + 3
}
func Add5(x int) int {
return x + 5
}
func doAll(x int, f1 func(int) int, f2 func(int) int) int {
return f2(f1(x))
}
func main() {
sum := doAll(1, Add3, Add5)
fmt.Println("sum:=========", sum)
}
5 匿名函數
定義匿名函數
func(){
執行語句
}
定義匿名函數並執行
func(){
執行語句
}()
例子如下:
func main() {
//直接定義匿名函數調用
func() {
fmt.Println("匿名函數1")
}()
//定義匿名函數,賦值給變數後調用
noname := func() {
fmt.Println("匿名函數2")
}
noname()
}
6 回呼函數
1)函數作為值時,可將函數作為一個參數傳遞到其他的函數裡面,其他的函數裡面執行這個函數參數。
2)函數回調的原理:
開始時候,定義了一個func(int)類型的函數(類似一個方法指標,指向func(int)函數),
函數值為argsfunc,值作為參數進行傳遞,然後調用argsfunc(),執行所對應的方法。
當argsfunc()時調用這個函數
例子如下:
func argsfunc(x int) {
fmt.Println("參數函數")
}
func callback(y int, f func(int)) {
f(y)
fmt.Println("argsfunc函數參數傳進來,回調回去")
}
func main() {
//argsfunc是一個func(int)類型的函數值
callback(1, argsfunc)
}
5 main函數和init函數
Go裡面有兩個保留的函數:init函數和main函數,這兩個函數在定義時不能有任何的參數和傳回值。
1)main函數
main函數只能在main package中使用。是程式的入口函數。
2)init函數
go程式在匯入每個package時候,首先會自動執行這個package的init函數。init函數主要用來做一些資料初始化。