defer 可以確保在函式返回時 語句的呼叫發生
引數在defer時計算,即defer fmt.println(i) 這個i的值在defer時就已經傳入給了println ,不論defer後i怎麼變,在最後執行println這個函式時,輸出的都是defer時傳入給它的值
defer棧為先進後出
package main
import "fmt"
func testdefer()
func main()
fmt.println()
fmt.fprintln(w io.writer,a ... inte***ce{}) //輸出到io.write
fmt.printf() 格式化輸出
fmt.fpintf(w io.writer,格式化字串,引數) 格式化輸出到io.write
fmt.sprintf(format string,a ... inte***ce{}) 返回乙個格式化字串
fmt.sprintln(a ...inte***ce{}) 返回乙個字串
向檔案中寫入斐波那契數列:
defer.go
package main
import (
"bufio"
"fmt"
"learngo/functional/fibanacc/fib"
"os"
)func writefile(filename string)
defer file.close() //刪除檔案控制代碼
//先向記憶體中去寫,當記憶體寫入到一定程度,再整塊寫入磁碟更快
writer := bufio.newwriter(file) //將file封裝成write
defer writer.flush() //將記憶體中的內容寫入到檔案中
generatenumber := fib.fibanacci()
for i := 0; i < 20; i++
}func main()
fib/fib.go
package fib
func fibanacci() func() int
}
何時使用defer呼叫
open/close
lock/unlock
printheader/printfooter
package main
import (
"bufio"
"fmt"
"learngo/functional/fibanacc/fib"
"os"
)func writefile(filename string) else
} defer file.close() //刪除檔案控制代碼
//先向記憶體中去寫,當記憶體寫入到一定程度,再整塊寫入磁碟更快
writer := bufio.newwriter(file) //將file封裝成write
defer writer.flush() //將記憶體中的內容寫入到檔案中
generatenumber := fib.fibanacci()
for i := 0; i < 20; i++
}func main()
這裡只是提供一種統一錯誤處理的思路:
至於具體如何包?可以直接包,也可以使用函式式程式設計,傳入乙個函式,然後返回乙個函式
all, err := ioutil.readall(file) //讀取檔案中的全部資料
if nil != err
writer.write(all) //返回響應
return nil
}panic :停止當前函式的執行,一直向上返回,並執行每一層的defer。如果沒有遇見recover,程式就退出
panic 是乙個很重的詞,要避免多次呼叫
recover:僅在defer中呼叫,獲取panic的值 封裝成介面並返回,如果無法處理可以重新panic
recover 的簡單使用:
/*
* @author: your name
* @date: 2020-11-04 13:45:53
* @lastedittime: 2020-11-04 13:58:12
* @lasteditors: please set lasteditors
* @description: in user settings edit
* @filepath: /learngo/errorhandling/recover/recover.go
*/package main
import "fmt"
func tryrecover()
//如果返回值 是將error 封裝成的介面
if err, ok := r.(error); ok else
}() //加() 連定義帶執行
// b := 0
// a := 5 / b
// fmt.println(a)
panic(123)
}func main()
什麼時候用error 什麼時候用panic?
盡量不要用panic
凡是能意料到的錯誤 都用 error 處理 ,例如 檔案打不開,error 就是乙個鴨子型別,乙個inte***ce,凡是具有 error方法的資料型別都可以作為error。 然後可以用log.prinf("發生錯誤:%s",e.error()) 來處理錯誤
意料之外的錯誤 用panic 處理
第八章(筆記)
能在 中進行記憶體單元的定址的暫存器只有4個,分別是bx si di bp 其中bx bp 是基址,bx對應的段位址是ds,bp對應的段位址是ss si di 是變址,單獨使用時段位址是ds,組合使用段位址是跟隨組合的基址對應的段位址 中進行記憶體單元定址彙總 si di bx bp 常量 si 常...
Go程式語言讀書筆記 第八章
第八章 goroutine和通道 goroutine 在go裡,每乙個併發執行的活動成為goroutine。語法上,乙個go語句實在普通的函式或者方法呼叫前加上go關鍵字。go f 新建乙個f 的goroutine,不用等待通道 如果說goroutine是go程式併發的執行體,通道就是他們之間的連線...
C Primer Plus 學習筆記(第八章)
c primer plus 學習筆記 第八章 c 內聯函式 內聯函式是c 為提高程式執行速度所做的一項改進。常規函式和內聯函式之間的主要區別不在於編寫方式,而在於c 編譯器如何將它們組合到程式中。編譯器將使用相應的函式 替換函式呼叫。對於內聯 程式無需跳到另乙個位置處執行 再跳回來。因此,內聯函式的...