最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang錯(cuò)誤處理方式異常與error

 更新時(shí)間:2023年01月14日 08:25:34   作者:憑什么我芒果過敏  
我們?cè)谑褂肎olang時(shí),不可避免會(huì)遇到異常情況的處理,與Java、Python等語言不同的是,Go中并沒有try...catch...這樣的語句塊,這個(gè)時(shí)候我們?nèi)绾尾拍芨玫奶幚懋惓D??本文來教你正確方法

Go 提供了兩種處理錯(cuò)誤 方式,

一 種是借助 panic和 recover 的拋出捕獲機(jī)制,

另一種使用error 錯(cuò)誤類型

一、異常

1、go沒有try/catch,而是使用panic/recover。

panic包出異常,后續(xù)代碼不再執(zhí)行

recover再defer中捕獲異常,使groutine(即程序)能夠正常退出。

1)只有panic,而沒有recover,程序宕機(jī)無法正常退出

package main
import "fmt"
func send(a, b int) int {
	if b == 0 {
		panic("wrong div")
	}
	c := a / b
	return c
}
func main() {
	defer func() {
		fmt.Println("wrong")
	}()
	send(1, 0)
}

執(zhí)行結(jié)果:錯(cuò)誤

2) 正確情況,使用panic、recover

package main
import "fmt"
func send(a, b int) int {
	if b == 0 {
		panic("wrong div")
	}
	c := a / b
	return c
}
func main() {
	defer func() {
		fmt.Println("wrong")
		if err := recover(); err != nil {
			fmt.Println(err) // 這里的err其實(shí)就是panic傳入的內(nèi)容
		}
	}()
	send(1, 0)
	fmt.Println("end")
}

執(zhí)行結(jié)果:正常退出

2、panic被觸發(fā)的情況

1)用戶顯視調(diào)用panic

2)go內(nèi)部自動(dòng)檢測(cè)出空指針、數(shù)組越界等情況,會(huì)隱式報(bào)出panic,不需要用戶主動(dòng)調(diào)用

隱式例子如下:其實(shí)程序會(huì)自動(dòng)拋出異常,不需要寫panic語句

package main
import "fmt"
func send(a, b int) int {
	c := a / b
	return c
}
func main() {
	defer func() {
		fmt.Println("wrong")
		if err := recover(); err != nil {
			fmt.Println(err) // 這里的err其實(shí)就是panic傳入的內(nèi)容
		}
	}()
	send(1, 0)
	fmt.Println("end")
}

二、錯(cuò)誤

如果使用panic,最主要的是“報(bào)panic之后的函數(shù)都不會(huì)被執(zhí)行,由defer recover”

那么對(duì)于服務(wù)使用panic,那后面的業(yè)務(wù)就都不被執(zhí)行了,那假如這其實(shí)是個(gè)我自己寫的小錯(cuò)誤呢?

比如:我的程序不允許我自定義的變量為空,為空的話我難道直接panic?那假如我程序還有別的接口邏輯假如沒用到這個(gè)變量呢?直接panic豈不是服務(wù)掛了。

所以其實(shí)我能日志報(bào)出來這個(gè)錯(cuò)誤就行了——error

https://segmentfault.com/q/1010000020000806

go提供了接口類型error:

type error interface {
	Error() string
}

故自定義錯(cuò)誤需要實(shí)現(xiàn)接口中的方法。

需要注意,方法的接受者如果是值,則調(diào)用相當(dāng)于進(jìn)行值拷貝,對(duì)副本進(jìn)行修改不會(huì)改變?cè)?/p>

方法的接受者是引用,相當(dāng)于傳遞的是變量的地址,原變量值才會(huì)被修改

package main
import "fmt"
type getName interface {
	printName()
	changeName()
	changeName2()
}
type dog struct {
	name string
	age  int
}
type cat struct {
	name string
	age  string
}
func (d dog) printName() {
	fmt.Println(d.name)
}
func (d dog) changeName() {
	d.name = "d2"
}
func (d *dog) changeName2() {
	d.name = "d2"
}
func (c cat) printName() {
	fmt.Println(c.name)
}
func main() {
	d := &dog{
		name: "d1",
		age:  1,
	}
	d.printName()
	d.changeName()
	fmt.Println("changeName", d.name)
	d.changeName2()
	fmt.Println("changeName2", d.name)
}

到此這篇關(guān)于Golang錯(cuò)誤處理方式異常與error的文章就介紹到這了,更多相關(guān)Go異常與error內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言中如何確保Cookie數(shù)據(jù)的安全傳輸

    Go語言中如何確保Cookie數(shù)據(jù)的安全傳輸

    這篇文章主要介紹了Go語言中如何確保Cookie數(shù)據(jù)的安全傳輸,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Go?Singleflight導(dǎo)致死鎖問題解決分析

    Go?Singleflight導(dǎo)致死鎖問題解決分析

    這篇文章主要為大家介紹了Go?Singleflight導(dǎo)致死鎖問題解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • golang中context的作用詳解

    golang中context的作用詳解

    這篇文章主要介紹了golang中context的作用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Go項(xiàng)目中的GOPROXY設(shè)置

    Go項(xiàng)目中的GOPROXY設(shè)置

    GOPROXY是Go語言中用于指定模塊代理服務(wù)器的環(huán)境變量,設(shè)置GOPROXY可以通過操作系統(tǒng)環(huán)境變量、Go命令行參數(shù)或Go環(huán)境配置文件進(jìn)行,感興趣的可以了解一下
    2024-09-09
  • Go語言func匿名函數(shù)閉包示例詳解

    Go語言func匿名函數(shù)閉包示例詳解

    這篇文章主要為大家介紹了Go語言func匿名函數(shù)閉包示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 淺析Go語言中閉包的使用

    淺析Go語言中閉包的使用

    閉包是一個(gè)函數(shù)和其相關(guān)的引用環(huán)境組合的一個(gè)整體。本文主要為大家介紹一下Go語言中閉包的使用,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語言有一定幫助,需要的可以參考一下
    2022-12-12
  • Go語言什么時(shí)候該使用指針

    Go語言什么時(shí)候該使用指針

    本文主要介紹了Go語言什么情況下應(yīng)該使用指針,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 重學(xué)Go語言之?dāng)?shù)組的具體使用詳解

    重學(xué)Go語言之?dāng)?shù)組的具體使用詳解

    Go的數(shù)組是一種復(fù)合數(shù)據(jù)類型,在平時(shí)開發(fā)中并不常用,更常用的是切片(slice),可以把切片看作是能動(dòng)態(tài)擴(kuò)容的數(shù)組,切片的底層數(shù)據(jù)結(jié)構(gòu)就是數(shù)組,所以數(shù)組雖不常用,但仍然有必要掌握
    2023-02-02
  • Go語言使用讀寫OPC詳解

    Go語言使用讀寫OPC詳解

    這篇文章主要介紹了Go語言使用讀寫OPC詳解,圖文講解的很清晰,有感興趣的同學(xué)可以學(xué)習(xí)下
    2021-03-03
  • golang通過context控制并發(fā)的應(yīng)用場(chǎng)景實(shí)現(xiàn)

    golang通過context控制并發(fā)的應(yīng)用場(chǎng)景實(shí)現(xiàn)

    這篇文章主要介紹了golang通過context控制并發(fā)的應(yīng)用場(chǎng)景實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01

最新評(píng)論

仲巴县| 平度市| 柳江县| 波密县| 将乐县| 新田县| 昌邑市| 小金县| 赤壁市| 忻州市| 顺义区| 贺兰县| 韩城市| 马尔康县| 峡江县| 新巴尔虎右旗| 福贡县| 普宁市| 安阳市| 鹰潭市| 秦安县| 五家渠市| 白朗县| 霍城县| 鲁山县| 玉山县| 靖西县| 仙居县| 松江区| 秦安县| 齐齐哈尔市| 平湖市| 阆中市| 卢湾区| 剑阁县| 黑水县| 温宿县| 手游| 广宁县| 买车| 乐安县|