Go語言學習筆記 第八章 錯誤處理 和資源管理

2021-10-10 05:50:52 字數 4243 閱讀 3582

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 編譯器如何將它們組合到程式中。編譯器將使用相應的函式 替換函式呼叫。對於內聯 程式無需跳到另乙個位置處執行 再跳回來。因此,內聯函式的...