web服務(wù)器管理的主要技術(shù)seo怎么做優(yōu)化計(jì)劃
從本書(shū)的開(kāi)始,我們就已經(jīng)創(chuàng)建和使用過(guò)神秘的預(yù)定義error類(lèi)型,而且沒(méi)有解釋它究竟是什么。實(shí)際上它就是interface類(lèi)型,這個(gè)類(lèi)型有一個(gè)返回錯(cuò)誤信息的單一方法:
type error interface { Error() string }
創(chuàng)建一個(gè)error最簡(jiǎn)單的方法就是調(diào)用errors.New函數(shù),它會(huì)根據(jù)傳入的錯(cuò)誤信息返回一個(gè)新的error。整個(gè)errors包僅只有4行:
package errors func New(text string) error { return &errorString{text} } type errorString struct { text string } func (e *errorString) Error() string { return e.text }
承載errorString的類(lèi)型是一個(gè)結(jié)構(gòu)體而非一個(gè)字符串,這是為了保護(hù)它表示的錯(cuò)誤避免粗心(或有意)的更新。并且因?yàn)槭侵羔橆?lèi)型*errorString
滿(mǎn)足error接口而非errorString類(lèi)型,所以每個(gè)New函數(shù)的調(diào)用都分配了一個(gè)獨(dú)特的和其他錯(cuò)誤不相同的實(shí)例。我們也不想要重要的error例如io.EOF和一個(gè)剛好有相同錯(cuò)誤消息的error比較后相等。
fmt.Println(errors.New("EOF") == errors.New("EOF")) // "false"
調(diào)用errors.New函數(shù)是非常稀少的,因?yàn)橛幸粋€(gè)方便的封裝函數(shù)fmt.Errorf,它還會(huì)處理字符串格式化。我們?cè)啻卧诘?章中用到它。
package fmt import "errors" func Errorf(format string, args ...interface{}) error { return errors.New(Sprintf(format, args...)) }
雖然*errorString
可能是最簡(jiǎn)單的錯(cuò)誤類(lèi)型,但遠(yuǎn)非只有它一個(gè)。例如,syscall包提供了Go語(yǔ)言底層系統(tǒng)調(diào)用API。在多個(gè)平臺(tái)上,它定義一個(gè)實(shí)現(xiàn)error接口的數(shù)字類(lèi)型Errno,并且在Unix平臺(tái)上,Errno的Error方法會(huì)從一個(gè)字符串表中查找錯(cuò)誤消息,如下面展示的這樣:
package syscall type Errno uintptr // operating system error code var errors = [...]string{ 1: "operation not permitted", // EPERM 2: "no such file or directory", // ENOENT 3: "no such process", // ESRCH // ... } func (e Errno) Error() string { if 0 <= int(e) && int(e) < len(errors) { return errors[e] } return fmt.Sprintf("errno %d", e) }
下面的語(yǔ)句創(chuàng)建了一個(gè)持有Errno值為2的接口值,表示POSIX ENOENT狀況:
var err error = syscall.Errno(2) fmt.Println(err.Error()) // "no such file or directory" fmt.Println(err) // "no such file or directory"
err的值圖形化的呈現(xiàn)在圖7.6中。
Errno是一個(gè)系統(tǒng)調(diào)用錯(cuò)誤的高效表示方式,它通過(guò)一個(gè)有限的集合進(jìn)行描述,并且它滿(mǎn)足標(biāo)準(zhǔn)的錯(cuò)誤接口。我們會(huì)在第7.11節(jié)了解到其它滿(mǎn)足這個(gè)接口的類(lèi)型。