ホームページ  >  記事  >  バックエンド開発  >  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 インターフェイスを実装しているためです。これは、io.Reader 型を受け入れる関数またはメソッドに os.File 型をパラメータとして渡すことができ、io.Reader メソッドを関数またはメソッド内で使用して os.File を操作できることを意味します。この柔軟性は Go 言語のインターフェイス特性を反映しており、コードがより簡潔で再利用可能になっています。したがって、パラメータの型が io.Reader として宣言されている場合でも、bufio.NewScanner に渡されるパラメータとして os.File を使用できます。

質問の内容

Go を学習し、bufio.newscanner を使用してファイルの内容を読み続けてみてください。これを行うには次のコードを使用します:

リーリー

定義を見てみると (少なくとも私にとっては) 何か奇妙に見えると思いましたが、上記の os.open("input.txt") は実際には * os.file# を返します。 ## と bufio.newscannerio を想定しています。パラメータとしてreaderを指定します。 reader はインターフェイスですが、file は構造体であり、そのインターフェイスなどは (可能な場合は) 実装されません。

しかし、これでまったく問題ないようです。 go の仕組みについて何か見逃しているのでしょうか?私は C# のバックグラウンドを持っていますが、パラメーターの型が異なるため、コンパイラーはこれを許可すべきではないように思えます。

ただ興味があるのですが、他にどこでこの質問をすればいいのかわかりません。

Solution

os.file は、実際には io.reader インターフェイスを実装しています。

これは、io.reader インターフェイスによって提供されるすべてのメソッドを同じシグネチャで実装することを意味します。

この特定のケースでは、この方法は次のとおりです:

リーリー

以上がGo では、定義では io.Reader のみを受け入れる必要があると定められているのに、なぜ bufio.NewScanner のパラメータとして *os.File を使用できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。