Go語言中定義函數使用func關鍵字,具體格式以下:閉包
func 函數名(參數)(返回值){ 函數體 }
其中:函數
func intSum(x int, y int) int { return x + y } // 函數的參數和返回值都是可選的 func sayHello() { fmt.Println("Hello World!") }
函數的參數中若是相鄰變量的類型相同,則能夠省略類型,例如:code
func intSum(x, y int) int { return x + y }
可變參數是指函數的參數數量不固定。Go語言中的可變參數經過在參數名後加...
來標識。回調函數
注意:可變參數一般要做爲函數的最後一個參數。string
Go語言中函數支持多返回值,函數若是有多個返回值時必須用()
將全部返回值包裹起來。class
func calc(x, y int) (int, int) { sum := x + y sub := x - y return sum, sub }
函數定義時能夠給返回值命名,並在函數體中直接使用這些變量,最後經過return
關鍵字返回。test
func calc(x, y int) (sum, sub int) { sum = x + y sub = x - y return }
Go語言中的defer
語句會將其後面跟隨的語句進行延遲處理。在defer
歸屬的函數即將返回時,將延遲處理的語句按defer
定義的逆序進行執行,也就是說,先被defer
的語句最後被執行,最後被defer
的語句,最早被執行。匿名函數
func main() { fmt.Println("start") defer fmt.Println(1) defer fmt.Println(2) defer fmt.Println(3) fmt.Println("end") } // 結果:start end 3 2 1
匿名函數就是沒有函數名的函數,匿名函數多用於實現回調函數和閉包。變量
匿名函數的定義格式以下:引用
func(參數)(返回值){ 函數體 } // 當即執行函數 func main() { func(x, y int) { fmt.Println(x + y) }(10, 20)//匿名函數定義完加()直接執行 }
閉包指的是一個函數和與其相關的引用環境組合而成的實體。簡單來講,閉包=函數+引用環境
。一些閉包示例:
func adder() func(int) int { var x int return func(y int) int { x += y return x } } func main() { var f = adder() fmt.Println(f(10)) //10 fmt.Println(f(20)) //30 fmt.Println(f(30)) //60 f1 := adder() fmt.Println(f1(40)) //40 fmt.Println(f1(50)) //90 } // 示例2 func adder2(x int) func(int) int { return func(y int) int { x += y return x } } func main() { var f = adder2(10) fmt.Println(f(10)) //20 fmt.Println(f(20)) //40 fmt.Println(f(30)) //70 f1 := adder2(20) fmt.Println(f1(40)) //60 fmt.Println(f1(50)) //110 } // 示例3 func makeSuffixFunc(suffix string) func(string) string { return func(name string) string { if !strings.HasSuffix(name, suffix) { return name + suffix } return name } } func main() { jpgFunc := makeSuffixFunc(".jpg") txtFunc := makeSuffixFunc(".txt") fmt.Println(jpgFunc("test")) //test.jpg fmt.Println(txtFunc("test")) //test.txt } // 示例4 func calc(base int) (func(int) int, func(int) int) { add := func(i int) int { base += i return base } sub := func(i int) int { base -= i return base } return add, sub } func main() { f1, f2 := calc(10) fmt.Println(f1(1), f2(2)) //11 9 fmt.Println(f1(3), f2(4)) //12 8 fmt.Println(f1(5), f2(6)) //13 7 }