Maison > Article > développement back-end > Dans Go, pourquoi pouvons-nous utiliser *os.File comme paramètre dans bufio.NewScanner alors que la définition dit qu'il ne doit accepter que io.Reader ?
Dans le langage Go, lorsque nous définissons une fonction ou une méthode pour recevoir le type de paramètre comme io.Reader, elle peut en fait accepter n'importe quel type qui implémente l'interface io.Reader. Par conséquent, lorsque nous utilisons os.File comme paramètre dans bufio.NewScanner, c'est parce que le type os.File implémente l'interface io.Reader. Cela signifie que le type os.File peut être transmis en tant que paramètre à une fonction ou une méthode qui accepte le type io.Reader, et que la méthode io.Reader peut être utilisée à l'intérieur de la fonction ou de la méthode pour opérer sur os.File. Cette flexibilité reflète les caractéristiques de l'interface du langage Go, rendant le code plus concis et réutilisable. Ainsi, même si le type de paramètre est déclaré comme io.Reader, nous pouvons toujours utiliser os.File comme paramètre transmis à bufio.NewScanner.
Essayez d'apprendre à utiliser bufio.newscanner
pour lire le contenu des fichiers. J'utilise le code suivant pour ce faire :
input_file, err := os.Open("input.txt") if err != nil { panic(err) } scanner := bufio.NewScanner(input_file) //do stuff
Je pensais que je regarderais la définition et verrais quelque chose de bizarre (du moins pour moi), le os.open("input.txt")
ci-dessus renvoie en fait un *os .file code> et
os.open("input.txt")
实际上返回一个 *os.file
和 bufio.newscanner
期望一个 io。 reader
作为参数。 reader
是一个接口,而 file
attendez un io. lecteur
en paramètre. reader
est une interface, tandis que file
est une structure, qui n'implémente pas cette interface ou quoi que ce soit du genre (si cela est possible).
Mais on dirait que tout va bien. Est-ce que j'ai raté quelque chose sur le fonctionnement de Go ? J'ai une expérience en C# et il me semble que les paramètres sont de types différents donc le compilateur ne devrait pas permettre cela, n'est-ce pas ?
Je suis juste curieux et je ne sais pas où poser cette question.
os.file implémente en fait l'interface io.reader.
Cela signifie qu'il implémente toutes les méthodes fournies par l'interface io.reader avec la même signature.
Dans ce cas particulier, cette méthode :
func (f *File) Read(b []byte) (n int, err error)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!