Dalam Go, mengapa kita boleh menggunakan *os.File sebagai parameter dalam bufio.NewScanner apabila definisi mengatakan ia hanya perlu menerima io.Reader?

王林
Lepaskan: 2024-02-08 23:39:32
ke hadapan
511 orang telah melayarinya

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

Dalam bahasa Go, apabila kita mentakrifkan fungsi atau kaedah untuk menerima jenis parameter sebagai io.Reader, ia sebenarnya boleh menerima sebarang jenis yang melaksanakan antara muka io.Reader. Oleh itu, apabila kami menggunakan os.File sebagai parameter dalam bufio.NewScanner, ia adalah kerana jenis os.File melaksanakan antara muka io.Reader. Ini bermakna jenis os.File boleh dihantar sebagai parameter kepada fungsi atau kaedah yang menerima jenis io.Reader, dan kaedah io.Reader boleh digunakan di dalam fungsi atau kaedah untuk beroperasi pada os.File. Fleksibiliti ini mencerminkan ciri antara muka bahasa Go, menjadikan kod lebih ringkas dan boleh digunakan semula. Jadi, walaupun jenis parameter diisytiharkan sebagai io.Reader, kita masih boleh menggunakan os.File sebagai parameter yang dihantar ke bufio.NewScanner.

Kandungan soalan

Cuba belajar pergi dan terus gunakan bufio.newscanner untuk membaca kandungan fail. Saya menggunakan kod berikut untuk melakukan ini:

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

if err != nil {
    panic(err)
}

scanner := bufio.NewScanner(input_file)
//do stuff
Salin selepas log masuk

Saya fikir saya akan melihat definisi dan melihat sesuatu yang pelik (sekurang-kurangnya bagi saya), os.open("input.txt") di atas sebenarnya mengembalikan *os .file dan os.open("input.txt") 实际上返回一个 *os.filebufio.newscanner 期望一个 io。 reader作为参数。 reader 是一个接口,而 file mengharapkan io. pembaca sebagai parameter. reader ialah antara muka, manakala file ialah struct, yang tidak melaksanakan antara muka itu atau apa-apa seperti itu (jika boleh).

Tetapi nampaknya ia baik-baik saja. Adakah saya kehilangan sesuatu tentang cara kerja? Saya mempunyai latar belakang c # dan nampaknya saya parameter adalah jenis yang berbeza jadi pengkompil tidak sepatutnya membenarkan ini, bukan?

Hanya ingin tahu dan tidak tahu di mana lagi untuk bertanya soalan ini.

Penyelesaian

os.file sebenarnya melaksanakan antara muka io.reader.

Ini bermakna ia melaksanakan semua kaedah yang disediakan oleh antara muka io.reader dengan tandatangan yang sama.

Dalam kes ini, kaedah ini:

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

Atas ialah kandungan terperinci Dalam Go, mengapa kita boleh menggunakan *os.File sebagai parameter dalam bufio.NewScanner apabila definisi mengatakan ia hanya perlu menerima io.Reader?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!