真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網站制作重慶分公司

go語言eof錯誤指的是什么

這篇文章主要介紹了go語言eof錯誤指的是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇go語言eof錯誤指的是什么文章都會有所收獲,下面我們一起來看看吧。

創(chuàng)新互聯(lián)長期為千余家客戶提供的網站建設服務,團隊從業(yè)經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網生態(tài)環(huán)境。為東蘭企業(yè)提供專業(yè)的網站設計、成都網站制作,東蘭網站改版等技術服務。擁有10年豐富建站經驗和眾多成功案例,為您定制開發(fā)。

在go語言中,eof是指文件結尾錯誤,是Go語言中最重要的錯誤變量,存在于io包中,用于表示輸入流的結尾。因為每個文件都有一個結尾,所以“io.EOF”很多時候并不能算是一個錯誤,它更重要的是表示一個輸入流結束了。

golang 文件結尾錯誤(EOF)

函數經常會返回多種錯誤,這對終端用戶來說可能會很有趣,但對程序而言,這使得情況變得復雜。很多時候,程序必須根據錯誤類型,作出不同的響應。讓我們考慮這樣一個例子:

從文件中讀取n個字節(jié)。如果n等于文件的長度,讀取過程的任何錯誤都表示失敗。如果n小于文件的長度,調用者會重復的讀取固定大小的數據直到文件結束。這會導致調用者必須分別處理由文件結束引起的各種錯誤。

基于這樣的原因,io包保證任何由文件結束引起的讀取失敗都返回同一個錯誤——io.EOF,該錯誤在io包中定義:

package io
import "errors"
// EOF is the error returned by Read when no more input is available.
var EOF = errors.New("EOF")

認識io.EOF

io.EOF是io包中的變量, 表示文件結束的錯誤:

package io23var EOF = errors.New("EOF")

也通過以下命令查看詳細文檔:

$ go doc io.EOF
var EOF = errors.New("EOF")
EOF is the error returned by Read when no more input is available. Functions
should return EOF only to signal a graceful end of input. If the EOF occurs
unexpectedly in a structured data stream, the appropriate error is either
ErrUnexpectedEOF or some other error giving more detail.
$

io.EOF大約可以算是Go語言中最重要的錯誤變量了, 它用于表示輸入流的結尾. 因為每個文件都有一個結尾, 所以io.EOF很多時候并不能算是一個錯誤, 它更重要的是表示一個輸入流結束了。

io.EOF設計的缺陷

可惜標準庫中的io.EOF的設計是有問題的. 首先EOF是End-Of-File的縮寫, 根據Go語言的習慣大寫字母縮寫一般表示常量. 可惜io.EOF被錯誤地定義成了變量, 這導致了API權限的擴散. 而最小化API權限是任何一個模塊或函數設計的最高要求. 通過最小化的權限, 可以盡早發(fā)現(xiàn)代碼中不必要的錯誤.

比如Go語言一個重要的安全設計就是禁止隱式的類型轉換. 因此這個設計我們就可以很容易發(fā)現(xiàn)程序的BUG. 此外Go語言禁止定義沒有被使用到的局部變量(函數參數除外, 因此函數參數是函數接口的一個部分)和禁止導入沒有用到的包都是最小化權限的最佳實踐. 這些最小API權限的設計不僅僅改進了程序的質量, 也提高了編譯工具的性能和輸出的目標文件.

因為EOF被定義成一個變量, 這導致了該變量可能會被惡意改變. 下面的代碼就是一種優(yōu)雅的埋坑方式:

func init() {2    io.EOF = nil3}

這雖然是一個段子, 但是卻真實地暴漏了EOF接口的設計缺陷: 它存在嚴重的安全隱患. 變量的類型似乎也在暗示用戶可以放心地修改變量的值. 因此說EOF是一個不安全也不優(yōu)雅的設計.

io.EOF改為常量

一個顯然的改進思路是將io.EOF定義為常量. 但是因為EOF對應一個表示error接口類型, 而Go語言目前的常量語法并不支持定義常量類型的接口. 但是我們可以通過一些技巧繞過這個限制.

Go語言的常量有bool/int/float/string/nil這幾種主要類型. 常量不僅僅不包含接口等復雜類型, 甚至連常量的數組或結構體都不支持! 不過常量有一個重要的擴展規(guī)則: 以bool/int/float/string/nil為基礎類型定義的新類型也支持常量.

比如, 我們重新定義一個字符串類型, 它也可以支持常量的:

type MyString string2const name MyString = "chai2010"

這個例子中MyString是一個新定義的類型, 可以定義這種類型的常量, 因為它的底層的string類型是支持常量的.

那么io.EOF的底層類型是什么呢? EOF是通過errors.New("EOF")定義的, 下面是這個函數的實現(xiàn):

package errors 
// New returns an error that formats as the given text. 
func New(text string) error {
    return &errorString{text} 
} 

// errorString is a trivial implementation of error. 
type errorString struct {
    s string
}

func (e *errorString) Error() string {
    return e.s
}

因此io.EOF底層的類型是errors.errorString結構體. 而結構體類型是不支持定義常量的. 不過errors.errorString結構體中只有一個字符串類型, io.EOF對應的錯誤字符串正是"EOF".

我們可以為EOF重新實現(xiàn)一個以字符串為底層類型的新錯誤類型:

package io

type errorString string

func (e errorString) Error() string {
    return string(e)
}

這個新的io.errorString實現(xiàn)了兩個特性: 首先是滿足了error接口; 其次它是基于string類型重新定義, 因此支持定義常量. 因此我們可以基于errorString重新將io.EOF定義為常量:

const EOF = errorString("EOF")

這樣EOF就變成了編譯時可以確定的常量類型, 常量的值依然是“EOF”字符串. 但是也帶來了新的問題: EOF已經不再是一個接口類型, 它會破壞舊代碼的兼容性嗎?

關于“go語言eof錯誤指的是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“go語言eof錯誤指的是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網頁名稱:go語言eof錯誤指的是什么
URL網址:http://weahome.cn/article/pegopj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部