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 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.
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
sebagai parameter. os.open("input.txt")
实际上返回一个 *os.file
和 bufio.newscanner
期望一个 io。 reader
作为参数。 reader
是一个接口,而 file
mengharapkan 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.
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!