Go語言不支持嵌套,重載和默認參數
但是
(1)無需聲明原型
(2)不定長度變參
(3)多返回值
(4)命名返回值參數
(5)匿名函數
(6)閉包
函數形式
返回值僅僅一個那麼返回值就不用小括號可以直接用
func name(參數)(返回值){
}
多返回值例子
package main
import "fmt"
func A()(int,int,int){
a,b,c:=1,2,3
return a,b,c
}
func main(){
a,b,c:=A()
fmt.Printf("%d,%d,%d",a,b,c)
}
注意區別
package main
import "fmt"
func A()(a,b,c int){
a,b,c=1,2,3
return//return a,b,c
}
func main(){
a,b,c:=A()
fmt.Printf("%d,%d,%d",a,b,c)
}
不定長變參
package main
import "fmt"
//must be the last one
//though the a is slice but is noly the value-copy
//s []int can change the old value
func A(a ...int){//a can be viewed as a slice
fmt.Println(a)
}
func main(){
A(1,2,3,4,5)
}
Go中指針
package main
import "fmt"
func A(a *int,b int){//a can be viewed as a slice
*a=b
}
func main(){
a:=1
b:=2
A(&a,b)
fmt.Println(a)
}
函數也是一個類型
package main
import "fmt"
func A(){
fmt.Println("FUNC A")
}
func main(){
a := A
a()
}
匿名函數
package main
import "fmt"
func main(){
a := func(){
fmt.Println("FUNC A")
}
a()
}
關於函數閉包
package main
import "fmt"
func closure(x int) func(int) int{
return func(y int)int{
return x+y
}
}
func main(){
f:=closure(10)
fmt.Println(f(1))
fmt.Println(f(2))
}
函數defer
行爲方式類似其他語言中的析構函數,在函數執行結束後按照調用順序的相反順序逐個執行
特性:即使函數發生嚴重錯誤也會執行
常用語資源清理文件關閉,解鎖以及記錄時間等操作
例子
package main
import "fmt"
func main(){
fmt.Println("a")
defer fmt.Println("b")
defer fmt.Println("c")
}
a c b,因爲defer逆序執行,先定義後執行
package main
import "fmt"
func main(){
for i:=0;i<3;i++{
defer func(){
fmt.Println(i)
}()//use the function
}
}
the results all are the 3,becaues i has changed
()用於調用函數
這是個閉包,i是個引用
Go沒有異常機制,但是有panic/recover模式來處理錯誤
panic可以在任何地方引發
recover只有在defer調用的函數中才有意義
package main
import "fmt"
func A(){
fmt.Println("func A")
}
func B(){
panic("panic in B")
}
func C(){
fmt.Println("func C")
}
func main(){
A()
B()
C()
}
B輸出以後就會停止調用C了
package main
import "fmt"
func A(){
fmt.Println("func A")
}
func B(){
defer func(){
if err:=recover();err!=nil{
fmt.Println("Recover in B")
}
}()//must before panic or will not be call
panic("panic in B")
}
func C(){
fmt.Println("func C")
}
func main(){
A()
B()
C()
}
panic不會被調用,C可以被調用