Saya mencoba untuk menerapkan beberapa objek Go io.Writer, tetapi menulis ke string, bukan file atau objek seperti file. Saya pikir bytes.Buffer
akan berhasil karena diimplementasikan Write(p []byte)
. Namun ketika saya mencoba ini:
import "bufio"
import "bytes"
func main() {
var b bytes.Buffer
foo := bufio.NewWriter(b)
}
Saya mendapatkan kesalahan berikut:
cannot use b (type bytes.Buffer) as type io.Writer in function argument:
bytes.Buffer does not implement io.Writer (Write method has pointer receiver)
Saya bingung, karena ini mengimplementasikan antarmuka dengan jelas. Bagaimana cara mengatasi kesalahan ini?
Jawaban:
Teruskan pointer ke buffer, bukan ke buffer itu sendiri:
sumber
Anda tidak perlu menggunakan "bufio.NewWriter (& b)" untuk membuat io.Writer. & b adalah io.Writer itu sendiri.
sumber
Gunakan saja
foo := bufio.NewWriter(&b)
Karena cara bytes.Buffer mengimplementasikan io.Writer adalah
Ini
b *Buffer
, tidakb Buffer
. (Saya juga berpikir itu aneh karena kita dapat memanggil metode dengan variabel atau penunjuknya, tetapi kita tidak dapat menetapkan penunjuk ke variabel jenis non-penunjuk.)Selain itu, prompt kompilator tidak cukup jelas:
bytes.Buffer does not implement io.Writer (Write method has pointer receiver)
Beberapa ide, Go gunakan
Passed by value
, jika kita meneruskanb
kebuffio.NewWriter()
, di NewWriter (), ini adalah barub
(buffer baru), bukan buffer asli yang kita definisikan, oleh karena itu kita perlu meneruskan alamatnya&b
.Tambahkan lagi, byte.Buffer didefinisikan:
menggunakan
passed by value
, struct penyangga baru yang diteruskan berbeda dari variabel penyangga asal.sumber