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 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 ?

王林
王林avant
2024-02-08 23:39:32552parcourir

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

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.

Contenu des questions

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.filebufio.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.

Workaround

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer