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

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

王林
王林ke hadapan
2024-02-08 23:39:32572semak imbas

在 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

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 kod> 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)

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam