函數(shù)function
創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都網(wǎng)站設計、網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的鎮(zhèn)遠網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!
-Go函數(shù)不支持嵌套、重載、和默認參數(shù)
-支持以下特性:
-無需聲明原型、不定長度變參、多返回值、命名返回值參數(shù)、匿名函數(shù)、閉包
-定義函數(shù)使用關鍵字func,且最左括號不能另起一行
-函數(shù)也可以作為一種類型使用
#func 函數(shù)名(參數(shù)列表,可為空)(設置可返回值類型,作為可選部分){}
func A1(a int,b string)(int,string){} //定義返回的類型
func A2(a ,b,c int)(int,string){} //定義函數(shù)值都為int類型
func A3(a int,b string)(int,string){}
##有命名返回值和不命名返回值區(qū)別:
定義多個參數(shù):可用不定常變參
func main(){
A(1,2,3,4,5,6)
}
func A(a...int){
fmt.Println(a)
}
值類型傳遞和SLICE傳遞區(qū)別:
##函數(shù)調用:
package main
import "fmt"
func max(num1 int, num2 int) int {
var result int
if num1 > num2 {
result = num1
} else {
result = num2
}
return result
}
func main() {
var a int = 100
var b int = 200
var ret int
ret = max(a, b)
fmt.Printf("最大值是:%d\n", ret)
}
函數(shù)定義時指出,函數(shù)定義時有參數(shù),該變量可稱為函數(shù)的形參。形參就像定義在函數(shù)體內的局部變量。
但當調用函數(shù),傳遞過來的變量就是函數(shù)的實參,函數(shù)可以通過兩種方式來傳遞參數(shù):
值傳遞:指在調用函數(shù)時將實際參數(shù)復制一份傳遞到函數(shù)中,這樣在函數(shù)中如果對參數(shù)進行修改,將不會影響到實際參數(shù)。
2. 引用傳遞:是指在調用函數(shù)時將實際參數(shù)的地址傳遞到函數(shù)中,那么在函數(shù)中對參數(shù)所進行的修改,將影響到實際參數(shù)
不定參數(shù)類型:
func myfunc(args ...int){}
egg:
package main
import "fmt"
func main() {
//var a int = 100
//var b int = 200
myfunc(100, 200, 300, 400, 500)
}
func myfunc(args ...int) {
fmt.Println(args)
for _, arg := range args {
fmt.Println(arg)
}
}
匿名函數(shù):
在Go里面,函數(shù)可以像普通變量一樣被傳遞或使用,Go語言支持隨時在代碼里定義匿名函數(shù),匿名函數(shù)由一個不帶函數(shù)名的函數(shù)聲明和函數(shù)體組成。匿名函數(shù)的優(yōu)越性在于可以直接使用函數(shù)內的變量,不必申明。
func main(){
a :=func(){ //函數(shù)里沒有名字
fmt.Println("FUNC A")
}
a()
}
func A(){
fmt.Println("FUNC A")
}
閉包:閉包是由函數(shù)及其相關引用環(huán)境組合而成的實體(即:閉包=函數(shù)+引用環(huán)境)
func main(){
a :=clousre(10){
fmt.Println(func(1))
fmt.Println(func(2))
}
}
func clousre(x int)func(int)int{
return func(y int)int{
return x+y
}
fmt.Println("FUNC A")
}
defer:(調用:先進后出,后進先出原則)
-執(zhí)行方式類似其他語言中的析構函數(shù),在函數(shù)體執(zhí)行結束后按照調用順序的相反順序逐個執(zhí)行
-即使函數(shù)發(fā)生嚴重錯誤也會執(zhí)行
-支持匿名函數(shù)的調用
-常用于資源清理、文件關閉、鎖解以及記錄時間等操作
-通過與匿名函數(shù)配合可在return之后修改函數(shù)計算結果
-如果函數(shù)體內某個變量作為defer時匿名函數(shù)的參數(shù),則在定義defer時即以獲得了拷貝,否則則是引用某個變量的地址
-Go沒有異常機制,但有panic/recover模式來處理錯誤
-Panic可以在任何地方引發(fā),但recover只有在defer調用的函數(shù)中有效
func main(){
for i :=0;i<3;i++{
defer fmt.Println(i)
}
}
func main(){
for i :=0;i<3;i++{
defer func(){
fmt.Println(i)}()
}
}
##recover案例
package main
import "fmt"
func main() {
A()
B()
C()
}
func A() {
fmt.Println("func A")
}
func B() {
defer func() {
if err := recover(); err != nil {
fmt.Println("Recover in B")
}
}()
panic("func B") //如果只有這條,執(zhí)行到這就停止了
}
func C() {
fmt.Println("func C")
}