golang ?-?@amazeUI ?-?2017-09-10 23:32:10
func main() {
????//????B("ok", 4)
????s1 := []int{1, 2, 3}
????a, b, c := 4, 5, 6
????C(s1, a, b, c)
????fmt.Println(s1)
????fmt.Println(a, b, c)
????d := D //這里可以直接將函數(shù)賦值到d
????d() ? ?//這里d就是一個函數(shù)了采记,要調(diào)用加上括號
????e := func() {
????????fmt.Println("匿名函數(shù)")
????}
????e()
????f := F(1) //這里返回的是一個匿名函數(shù),傳入?yún)?shù)為1作為閉包參數(shù)
????g := f(2) //在這里調(diào)用這個函數(shù)1+2
????h := f(3)
????fmt.Println(g, h)
????//????defer fmt.Println(1)
????//????defer fmt.Println(2) //在這里可以看到先打印的是這個2然后再輸出的1
????//????//defer有延遲的意思,執(zhí)行順序是倒著來的
????//????for i := 0; i < 3; i++ {
????//????????defer fmt.Println(i) //在這里可以看到先是會打印210狰住,然后再打印上面兩個defer
????//????}
????//將上面的defer全部屏蔽
????//????for i := 0; i < 3; i += 1 {
????//????????defer func() {
????//????????????fmt.Println(i)
????//????????}() //為何在這里打印出來的是3個3官辽,而上麥年的打印出來的是按順序的呢
????//????????//來理清楚程序執(zhí)行過程悯辙,上一個打印021的defer,傳遞進去的i,是做為一個參數(shù)傳遞進去的
????//????????//程序會將這個i做一個拷貝。而這一個defr是一個匿名函數(shù)莫鸭,傳遞進去的是一個閉包參數(shù)铣缠,是引用
????//????????//類型的谚咬,所以for執(zhí)行完后鹦付,i已經(jīng)等于3了,再來進行三次defer調(diào)用打印出來的就都是3了
????//????}
????A1()
????A2()
????A3() //復盤一下程序執(zhí)行過程择卦,首先執(zhí)行A1,程序執(zhí)行到A2敲长,首先執(zhí)行的是panic,defer在出現(xiàn)
????//重大故障的情況下也可以執(zhí)行秉继,所以程序再次調(diào)到defer,panic不執(zhí)行祈噪,在defer里恢復狀態(tài)后
????//程序調(diào)到了A3
}
func A(a int, b int) int {
????//基本使用方法,函數(shù)命名關(guān)鍵詞為func,傳入?yún)?shù)需聲明尚辑,若有返回參數(shù)可以在后面聲明
????//如果有返回值辑鲤,不做返回值類型聲明會報錯
????return a + b
}
func B(b string, a ...int) {
????//不定長變參,輸入進來的多個數(shù)會組合成一個slice,不定長變參需要作為最后一個參數(shù)
????fmt.Println(a)
????fmt.Println(b)
}
func C(a []int, b ...int) {
????//在這里做個實驗杠茬,第一個參數(shù)傳入一個slice,第二個參數(shù)傳入一個不定長變參
????a[0] = 0
????a[1] = 0
????a[2] = 0
????b[0] = 0
????b[1] = 0
????b[2] = 0
????fmt.Println(a)
????fmt.Println(b)
????//在這里可以看到a作為一個slice傳入進來后月褥,修改它內(nèi)部的值,跳出此函數(shù)后main函數(shù)內(nèi)這個slice
????//的值也會隨著改變瓢喉,這里是引用類型的傳入的是一個內(nèi)存地址的拷貝
????//宁赤,第二個參數(shù)傳入進來后會組成一個slice,修改它的值并不會修
????//該main函數(shù)里的值.
}
func D() {
????fmt.Println("函數(shù)是一個類型")
}
func F(f int) func(int) int {
????//傳入一個int,返回一個函數(shù)
????return func(g int) int {
????????return f + g
????}
}
func A1() {
????fmt.Println("is A1")
}
func A2() {
????defer func() {
????????//在這里定義一個defer,在程序執(zhí)行完后從恐慌狀態(tài)recover到正常狀態(tài)
????????//檢測是否有恐慌,recover只在defer中才有效
????????if err := recover(); err != nil {
????????????fmt.Println("已成功恢復")
????????}
????}()
????panic("panic A2") //恐慌栓票,執(zhí)行到這里不會再繼續(xù)往下執(zhí)行官
}
func A3() {
????fmt.Println("is A3")
}