欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang?中?recover()的使用方法

 更新時間:2022年04月19日 09:09:23   作者:sndapk  
這篇文章主要介紹了Guam與golang??recover()的使用方法,Recover?是一個Go語言的內(nèi)建函數(shù),可以讓進入宕機流程中的?goroutine?恢復(fù)過來,下文更多相關(guān)資料需要的小伙伴可以參考一下

Recover 是一個Go語言的內(nèi)建函數(shù),可以讓進入宕機流程中的 goroutine 恢復(fù)過來,recover 僅在延遲函數(shù) defer 中有效,在正常的執(zhí)行過程中,調(diào)用 recover 會返回 nil 并且沒有其他任何效果,如果當(dāng)前的 goroutine 陷入恐慌,調(diào)用 recover 可以捕獲到 panic 的輸入值,并且恢復(fù)正常的執(zhí)行。
通常來說,不應(yīng)該對進入 panic 宕機的程序做任何處理,但有時,需要我們可以從宕機中恢復(fù),至少我們可以在程序崩潰前,做一些操作,舉個例子,當(dāng) web 服務(wù)器遇到不可預(yù)料的嚴重問題時,在崩潰前應(yīng)該將所有的連接關(guān)閉,如果不做任何處理,會使得客戶端一直處于等待狀態(tài),如果 web 服務(wù)器還在開發(fā)階段,服務(wù)器甚至可以將異常信息反饋到客戶端,幫助調(diào)試。

在其他語言里,宕機往往以異常的形式存在,底層拋出異常,上層邏輯通過try/catch 機制捕獲異常,沒有被捕獲的嚴重異常會導(dǎo)致宕機,捕獲的異??梢员缓雎?,讓代碼繼續(xù)運行。

Go語言沒有異常系統(tǒng),其使用 panic 觸發(fā)宕機類似于其他語言的拋出異常,recover 的宕機恢復(fù)機制就對應(yīng)其他語言中的 try/catch 機

Recover的用法:

defer可以讀取有名返回值

理論:如果不進行recover,便會導(dǎo)致整個程序掛掉,

Recover()用法是:Recover()寫在defer中,并且在可能發(fā)生panic的地方之前,先調(diào)用此defer的東西(讓系統(tǒng)方法域結(jié)束時,有代碼要執(zhí)行。)當(dāng)程序遇到panic的時候(當(dāng)然,也可以正常的調(diào)用出現(xiàn)的異常情況),系統(tǒng)將跳過后面的代碼,進入defer,如果defer函數(shù)中recover(),則返回捕獲到的panic的值。

總結(jié):使用recover()捕捉panic異常的時候,則需要defer來讀取一個匿名函數(shù),

defer func(){
If err:=recover();err!=nil{//注意必須要判斷
打印捕捉的err內(nèi)容
}
}()//用來調(diào)用此匿名函數(shù)

package main

import (
“fmt”
“l(fā)og”
)

func tast2() {
fmt.Println(“sssssssss”)
}
func tast(x int) {
defer func() {
if err:=recover();err !=nil{
fmt.Println(err)
}

}()
var a [10]int
a[x]=1222
log.Println(a)
}
func main(){
tast(20)
tast2()
}

希望goroutine在函數(shù)執(zhí)行時不會因崩潰導(dǎo)致剩余程序運行,同時設(shè)置一個默認返回值

package main

import (
	"fmt"
	"time"
)

func calcRem(i int) (res int) {
	defer func() {
		if err := recover(); err != nil {
			fmt.Printf("error: %s\n", err)
			res = 999 //干擾輸出
		}
	}()

	res = 10 / (10 % i) //當(dāng)余數(shù)取余為0時,res為0
	fmt.Printf("10 / (10 %% %d) = %d\n", i, res)
	return
}

func main() {
	resCH := make(chan int, 10)
	defer close(resCH)

	for i := 1; i <= 10; i++ {
		go func(i int) {
			res := calcRem(i)
			resCH <- res
		}(i)
		time.Sleep(time.Microsecond * 100)
	}
	time.Sleep(time.Second)
	fmt.Printf("ch len is: %d\n", len(resCH))
	for i := 1; i <= 10; i++ {
		res := <-resCH
		fmt.Println(res)
	}
}

output

error: runtime error: integer divide by zero
error: runtime error: integer divide by zero
10 / (10 % 3) = 10
10 / (10 % 4) = 5
error: runtime error: integer divide by zero
10 / (10 % 6) = 2
10 / (10 % 7) = 3
10 / (10 % 8) = 5
10 / (10 % 9) = 10
error: runtime error: integer divide by zero
ch len is: 10
999
999
10
5
999
2
3
5
10
999

到此這篇關(guān)于Guam與golang recover()的使用方法的文章就介紹到這了,更多相關(guān)golang recover()用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go?語言數(shù)據(jù)結(jié)構(gòu)如何實現(xiàn)抄一個list示例詳解

    Go?語言數(shù)據(jù)結(jié)構(gòu)如何實現(xiàn)抄一個list示例詳解

    這篇文章主要為大家介紹了Go?語言數(shù)據(jù)結(jié)構(gòu)如何實現(xiàn)抄一個list示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Go語言strconv包實現(xiàn)字符串和數(shù)值類型的相互轉(zhuǎn)換

    Go語言strconv包實現(xiàn)字符串和數(shù)值類型的相互轉(zhuǎn)換

    這篇文章主要介紹了Go語言strconv包實現(xiàn)字符串和數(shù)值類型的相互轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Go?mod包管理工具詳解

    Go?mod包管理工具詳解

    Go?mod作為Go語言的官方包管理工具,可以幫助開發(fā)者更好地管理包和依賴,提高開發(fā)效率和項目可維護性,本文將介紹Go語言的包和依賴管理,以及Go?mod的作用和優(yōu)勢,需要的朋友可以參考下
    2023-05-05
  • 詳解Go語言中for range的

    詳解Go語言中for range的"坑"

    這篇文章主要介紹了詳解Go語言中for range的"坑",文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 詳解Go語言中的監(jiān)視器模式與配置熱更新

    詳解Go語言中的監(jiān)視器模式與配置熱更新

    這篇文章主要為大家詳細介紹了Go語言中的監(jiān)視器模式與配置熱更新的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • 詳解Golang如何使用Debug庫優(yōu)化代碼

    詳解Golang如何使用Debug庫優(yōu)化代碼

    這篇文章將針對Golang的debug庫進行全面解讀,涵蓋其核心組件、高級功能和實戰(zhàn)技巧,文中的示例代碼講解詳細,有需要的小伙伴可以參考下
    2024-02-02
  • golang 整合antlr語法校驗解析

    golang 整合antlr語法校驗解析

    Antlr是一個語法分析器,本身是用java實現(xiàn)的,然是Runtime的庫也支持Golang、Java、Python等,本文給大家講解使用golang整合antlr進行語法解析,感興趣的朋友一起看看吧
    2023-02-02
  • Golang中常見的三種并發(fā)控制方式使用小結(jié)

    Golang中常見的三種并發(fā)控制方式使用小結(jié)

    這篇文章主要為大家詳細介紹了如何對goroutine并發(fā)行為的控制,在Go中最常見的有三種方式:sync.WaitGroup、channel和Context,下面我們就來看看他們的具體使用吧
    2024-01-01
  • 輕松讀懂Golang中的數(shù)組和切片

    輕松讀懂Golang中的數(shù)組和切片

    這篇文章主要給大家介紹了關(guān)于Golang中數(shù)組和切片的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家學(xué)習(xí)或者Golang具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-03-03
  • Golang時間處理中容易踩的坑分析解決

    Golang時間處理中容易踩的坑分析解決

    這篇文章主要為大家介紹了Golang時間處理中容易踩的坑分析解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01

最新評論