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?
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.
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.file
和 bufio.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.
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!