第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

解鎖即可觀看《Go開發(fā)工程師》完整課程視頻

Go開發(fā)工程師

未來3-5年企業(yè)高性能項(xiàng)目不可替代的語言,從基礎(chǔ)到項(xiàng)目實(shí)戰(zhàn)再到重構(gòu),真正從入門到精通

【第1周】Go基礎(chǔ)知識(shí)入門
【第2周】容器,go編程思想
【第3周】Go并發(fā)編程和工程管理
【第4周】從0開始理解rpc和grpc
【第5周】grpc和protobuf進(jìn)階
【第6周】 yapi文檔管理、gorm詳解
【第7周】gin快速入門
【第8周】用戶服務(wù)的grpc服務(wù)
【第9周】用戶服務(wù)的web服務(wù)
【第10周】服務(wù)注冊(cè)/發(fā)現(xiàn)、配置中心、負(fù)載均衡
【第11周】商品微服務(wù)的grpc服務(wù)
【第12周】 商品微服務(wù)的gin層和oss圖片服務(wù)
【第13周】庫存服務(wù)和分布式鎖
【第14周】訂單和購物車微服務(wù)
【第15周】 支付寶支付、用戶操作微服務(wù)、前后端聯(lián)調(diào)
【第16周】elasticsearch實(shí)現(xiàn)搜索微服務(wù)
【第17周】 分布式理論基礎(chǔ)、分布式事務(wù)解決方案
【第18周】 學(xué)習(xí)rocketmq實(shí)現(xiàn)冪等性機(jī)制等
【第19周】鏈路追蹤、限流、熔斷、降級(jí)
【第20周】api網(wǎng)關(guān)、部署
【第21周】開發(fā)規(guī)范和go基礎(chǔ)擴(kuò)展
【第22周】設(shè)計(jì)模式和單元測(cè)試
【第23周】protoc插件開發(fā)、cobra命令行
【第24周】log日志包設(shè)計(jì)
【第25周】ast代碼生成工具開發(fā)
【第26周】三層代碼結(jié)構(gòu)
【第27周】grpc服務(wù)封裝更方便的rpc服務(wù)
【第28周】深入grpc的服務(wù)注冊(cè)、負(fù)載均衡原理
【第29周】基于gin封裝api服務(wù)
【第30周】可觀測(cè)的終極解決方案
【第31周】系統(tǒng)監(jiān)控核心
【第32周】用戶、商品服務(wù)重構(gòu)
【第33周】訂單、庫存等服務(wù)重構(gòu)
【第33+周】訂單服務(wù)重構(gòu)、wire進(jìn)行ioc控制
【第34周】通過k8s部署服務(wù)
【第34+周】devops和k8s
章節(jié)
問答
課簽
筆記
評(píng)論
占位
占位

Go語言異常處理——error

    Go語言的函數(shù)可以一次返回多個(gè)結(jié)果。這就為我們溫和地報(bào)告錯(cuò)誤提供了語言級(jí)別的支持。實(shí)際上,這也是Go語言中處理錯(cuò)誤的慣用法之一。我們先來回顧前一小節(jié)的例子:

func readFile(path string) ([]byte, error) {
    file, err := os.Open(path)
    if err != nil {
        return nil, err
    }
    defer file.Close()
    return ioutil.ReadAll(file)
}

    函數(shù)readFile有兩個(gè)結(jié)果聲明。第二個(gè)結(jié)果聲明的類型是error。error是Go語言內(nèi)置的一個(gè)接口類型。它的聲明是這樣的:

type error interface { 
    Error() string
}

    顯然,只要一個(gè)類型的方法集合包含了名為Error、無參數(shù)聲明且僅聲明了一個(gè)string類型的結(jié)果的方法,就相當(dāng)于實(shí)現(xiàn)了error接口。os.Open函數(shù)的第二個(gè)結(jié)果值就的類型就是這樣的。我們把它賦給了變量err。也許你已經(jīng)意識(shí)到,在Go語言中,函數(shù)與其調(diào)用方之間溫和地傳遞錯(cuò)誤的方法即是如此。
   
    在調(diào)用了os.Open函數(shù)并取得其結(jié)果之后,我們判斷err是否為nil。如果答案是肯定的,那么就直接把該錯(cuò)誤(這里由err代表)返回給調(diào)用方。這條if語句實(shí)際上是一條衛(wèi)述語句。這樣的語句會(huì)檢查流程中的某個(gè)步驟是否存在異常,并在必要時(shí)中止流程并報(bào)告給上層的程序(這里是調(diào)用方)。在Go語言的標(biāo)準(zhǔn)庫以及很多第三方庫中,我們經(jīng)常可以看到這樣的代碼。我們也建議大家在自己的程序中善用這樣的衛(wèi)述語句。
   
    現(xiàn)在我們把目光聚焦到readFile函數(shù)中的最后一條語句上。這是一條return語句。它把對(duì)ioutil.ReadAll函數(shù)的調(diào)用的結(jié)果直接作為readFile函數(shù)的結(jié)果返回了。實(shí)際上,ioutil.ReadAll函數(shù)的結(jié)果聲明列表與readFile的結(jié)果聲明列表是一致的。也就是說,它們聲明的結(jié)果的數(shù)量、類型和順序都是相同的。因此,我們才能夠做這種返回結(jié)果上的“嫁接”。這又是一個(gè)Go語言編碼中的慣用法。
   
    好了,在知曉怎樣在傳遞錯(cuò)誤之后,讓我們來看看怎樣創(chuàng)造錯(cuò)誤。沒錯(cuò),在很多時(shí)候,我們需要?jiǎng)?chuàng)造出錯(cuò)誤(即error類型的值)并把它傳遞給上層程序。這很簡(jiǎn)單。只需調(diào)用標(biāo)準(zhǔn)庫代碼包errorsNew函數(shù)即可。例如,我們只要在readFile函數(shù)的開始處加入下面這段代碼就可以更快的在參數(shù)值無效時(shí)告知調(diào)用方:

if path == "" {
    return nil, errors.New("The parameter is invalid!")
}   

    errors.New是一個(gè)很常用的函數(shù)。在Go語言標(biāo)準(zhǔn)庫的代碼包中有很多由此函數(shù)創(chuàng)建出來的錯(cuò)誤值,比如os.ErrPermission、io.EOF等變量的值。我們可以很方便地用操作符==來判斷一個(gè)error類型的值與這些變量的值是否相等,從而來確定錯(cuò)誤的具體類別。就拿io.EOF來說,它代表了一個(gè)信號(hào)。該信號(hào)用于通知數(shù)據(jù)讀取方已無更多數(shù)據(jù)可讀。我們?cè)诘玫竭@樣一個(gè)錯(cuò)誤的時(shí)候不應(yīng)該把它看成一個(gè)真正的錯(cuò)誤,而應(yīng)該只去結(jié)束相應(yīng)的讀取操作。請(qǐng)看下面的示例:

br := bufio.NewReader(file)
var buf bytes.Buffer
for {
    ba, isPrefix, err := br.ReadLine()
    if err != nil {
        if err == io.EOF {
            break
        }
        fmt.Printf("Error: %s\n", err)
        break
    }
    buf.Write(ba)
    if !isPrefix {
        buf.WriteByte('\n')
    }
}

    可以看到,這段代碼使用到了前面示例中的變量file。它的功能是把file代表的文件中的所有內(nèi)容都讀取到一個(gè)緩沖器(由變量buf代表)中。請(qǐng)注意,該示例中的第6~8行代碼。如果判定err代表的錯(cuò)誤值等于io.EOF的值(即它們是同一個(gè)值),那么我們只需退出當(dāng)前的循環(huán)以使讀取操作結(jié)束即可。
  
    總之,只要能夠善用error接口、errors.New函數(shù)和比較操作符==,我們就可以玩兒轉(zhuǎn)Go語言中的一般錯(cuò)誤處理。

任務(wù)

    命令源碼文件index.go的功能是讀取自己的內(nèi)容。這其中用到了readFile函數(shù)。請(qǐng)注意,我把這個(gè)函數(shù)中的最后一條語句替換成了return read(file)。你現(xiàn)在的任務(wù)是,結(jié)合本節(jié)“知識(shí)要點(diǎn)”中的最后一段代碼編寫出一個(gè)完整的read函數(shù),使得該文件可以正確地被運(yùn)行,并在標(biāo)準(zhǔn)輸出打印出index.go文件的內(nèi)容。

    該文件中的導(dǎo)入語句中已列出了所有可能會(huì)用到的標(biāo)準(zhǔn)庫代碼包。在Go語言官方的文檔網(wǎng)站上可以查到其中各種程序?qū)嶓w的用法。

    注意:由于本編程課件中無法模擬真實(shí)的程序運(yùn)行環(huán)境,所以它讀取index.go文件的操作是不會(huì)成功的。請(qǐng)你把index.go中的代碼(包括你寫的read函數(shù))復(fù)制到一臺(tái)Linux或Mac機(jī)器上再加以運(yùn)行。

?不會(huì)了怎么辦

 read函數(shù)的實(shí)現(xiàn)可以是:

func read(r io.Reader) ([]byte, error) {
    br := bufio.NewReader(r)
    var buf bytes.Buffer
    for {
        ba, isPrefix, err := br.ReadLine()
        if err != nil {
            if err == io.EOF {
                break
            }
            return nil, err
        }
        buf.Write(ba)
        if !isPrefix {
            buf.WriteByte('\n')
        }
    }
    return buf.Bytes(), nil
}

 

||

提問題

寫筆記

公開筆記
提交
||

請(qǐng)驗(yàn)證,完成請(qǐng)求

由于請(qǐng)求次數(shù)過多,請(qǐng)先驗(yàn)證,完成再次請(qǐng)求

加群二維碼

打開微信掃碼自動(dòng)綁定

您還未綁定服務(wù)號(hào)

綁定后可得到

  • · 粉絲專屬優(yōu)惠福利
  • · 大咖直播交流干貨
  • · 課程更新,問題答復(fù)提醒
  • · 賬號(hào)支付安全提醒

收藏課程后,能更快找到我哦~

使用 Ctrl+D 可將課程添加到書簽

邀請(qǐng)您關(guān)注公眾號(hào)
關(guān)注后,及時(shí)獲悉本課程動(dòng)態(tài)

舉報(bào)

0/150
提交
取消
全部 精華 我要發(fā)布
全部 我要發(fā)布
最熱 最新
只看我的

手記推薦

更多

本次提問將花費(fèi)2個(gè)積分

你的積分不足,無法發(fā)表

為什么扣積分?

本次提問將花費(fèi)2個(gè)積分

繼續(xù)發(fā)表請(qǐng)點(diǎn)擊 "確定"

為什么扣積分?