首頁  >  文章  >  後端開發  >  在 Go 中,當定義顯示它應該只接受 io.Reader 時,為什麼我們可以在 bufio.NewScanner 中使用 *os.File 作為參數?

在 Go 中,當定義顯示它應該只接受 io.Reader 時,為什麼我們可以在 bufio.NewScanner 中使用 *os.File 作為參數?

王林
王林轉載
2024-02-08 23:39:32489瀏覽

在 Go 中,当定义表明它应该只接受 io.Reader 时,为什么我们可以在 bufio.NewScanner 中使用 *os.File 作为参数?

在Go語言中,當我們定義一個函數或方法接收的參數類型為io.Reader時,實際上它可以接受任何實作了io.Reader介面的類型。因此,當我們在bufio.NewScanner中使用os.File作為參數時,是因為os.File類型實作了io.Reader介面。這意味著os.File類型可以作為參數傳遞給接受io.Reader類型的函數或方法,而且在函數或方法內部可以使用io.Reader的方法來對os.File進行操作。這種彈性是Go語言介面特性的體現,使得程式碼更加簡潔可重複使用。所以,即使參數類型宣告為io.Reader,我們還是可以使用os.File作為參數傳遞給bufio.NewScanner。

問題內容

嘗試學習 go 並且一直使用 bufio.newscanner 來讀取檔案內容。我使用以下程式碼執行此操作:

input_file, err := os.Open("input.txt")

if err != nil {
    panic(err)
}

scanner := bufio.NewScanner(input_file)
//do stuff

以為我會看看定義並看到一些奇怪的東西(至少對我來說),上面的os.open("input.txt") 實際上返回一個* os.filebufio.newscanner 期望一個io。 reader作為參數。 reader 是一個接口,而 file 是一個結構體,它不實作該介面或類似的東西(如果可能的話)。

但看起來這完全沒問題。我是否遺漏了 go 的工作原理?我有 c# 背景,對我來說參數是不同類型的,所以編譯器不應該允許這樣做,對嗎?

只是好奇,不知道還能在哪裡問這個問題。

解決方法

os.file 實際上正在實作 io.reader 介面。

這表示它實作了 io.reader 介面提供的所有具有相同簽章的方法。

在這種特殊情況下,此方法:

func (f *File) Read(b []byte) (n int, err error)

以上是在 Go 中,當定義顯示它應該只接受 io.Reader 時,為什麼我們可以在 bufio.NewScanner 中使用 *os.File 作為參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除