Heim >Backend-Entwicklung >Golang >Warum können wir in Go *os.File als Parameter in bufio.NewScanner verwenden, wenn die Definition besagt, dass nur io.Reader akzeptiert werden soll?

Warum können wir in Go *os.File als Parameter in bufio.NewScanner verwenden, wenn die Definition besagt, dass nur io.Reader akzeptiert werden soll?

王林
王林nach vorne
2024-02-08 23:39:32571Durchsuche

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

Wenn wir in der Go-Sprache eine Funktion oder Methode zum Empfangen des Parametertyps io.Reader definieren, kann sie tatsächlich jeden Typ akzeptieren, der die io.Reader-Schnittstelle implementiert. Wenn wir also os.File als Parameter in bufio.NewScanner verwenden, liegt das daran, dass der Typ os.File die Schnittstelle io.Reader implementiert. Dies bedeutet, dass der Typ os.File als Parameter an eine Funktion oder Methode übergeben werden kann, die den Typ io.Reader akzeptiert, und die Methode io.Reader kann innerhalb der Funktion oder Methode verwendet werden, um os.File zu bearbeiten. Diese Flexibilität spiegelt die Schnittstelleneigenschaften der Go-Sprache wider und macht den Code prägnanter und wiederverwendbar. Selbst wenn der Parametertyp als io.Reader deklariert ist, können wir also weiterhin os.File als Parameter verwenden, der an bufio.NewScanner übergeben wird.

Frageninhalte

Versuchen Sie zu lernen, loszulegen und weiterhin bufio.newscanner zum Lesen von Dateiinhalten zu verwenden. Ich verwende dazu den folgenden Code:

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

if err != nil {
    panic(err)
}

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

Ich dachte, ich würde mir die Definition ansehen und etwas Seltsames entdecken (zumindest für mich), der obige os.open("input.txt") gibt tatsächlich eine *os .file zurück code> und os.open("input.txt") 实际上返回一个 *os.filebufio.newscanner 期望一个 io。 reader作为参数。 reader 是一个接口,而 file erwarten ein io. reader als Parameter. reader ist eine Schnittstelle, während file eine Struktur ist, die diese Schnittstelle oder ähnliches nicht implementiert (sofern das möglich ist).

Aber es scheint völlig in Ordnung zu sein. Übersehe ich etwas darüber, wie Go funktioniert? Ich habe einen C#-Hintergrund und es scheint mir, dass die Parameter unterschiedlichen Typs sind, sodass der Compiler dies nicht zulassen sollte, oder?

Ich bin nur neugierig und weiß nicht, wo ich diese Frage sonst stellen soll.

Workaround

os.file implementiert tatsächlich die io.reader-Schnittstelle.

Das bedeutet, dass alle von der io.reader-Schnittstelle bereitgestellten Methoden mit derselben Signatur implementiert werden.

In diesem speziellen Fall diese Methode:

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

Das obige ist der detaillierte Inhalt vonWarum können wir in Go *os.File als Parameter in bufio.NewScanner verwenden, wenn die Definition besagt, dass nur io.Reader akzeptiert werden soll?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen