Chỉ dùng
foo := bufio.NewWriter(&b)
Bởi vì cách byte.Buffer triển khai io.Writer là
func (b *Buffer) Write(p []byte) (n int, err error) {
...
}
// io.Writer definition
type Writer interface {
Write(p []byte) (n int, err error)
}
Nó b *Buffer
, không phải b Buffer
. (Tôi cũng nghĩ thật kỳ lạ khi chúng ta có thể gọi một phương thức bằng một biến hoặc con trỏ của nó, nhưng chúng ta không thể gán một con trỏ cho một biến kiểu không phải là con trỏ.)
Bên cạnh đó, lời nhắc trình biên dịch không đủ rõ ràng:
bytes.Buffer does not implement io.Writer (Write method has pointer receiver)
Một số ý tưởng, Hãy sử dụng Passed by value
, nếu chúng ta chuyển b
đến buffio.NewWriter()
, trong NewWriter (), nó là một b
bộ đệm mới (một bộ đệm mới), không phải bộ đệm ban đầu mà chúng ta đã xác định, do đó chúng ta cần chuyển địa chỉ &b
.
Nối lại, byte.Buffer được định nghĩa:
type Buffer struct {
buf []byte // contents are the bytes buf[off : len(buf)]
off int // read at &buf[off], write at &buf[len(buf)]
bootstrap [64]byte // memory to hold first slice; helps small buffers avoid allocation.
lastRead readOp // last read operation, so that Unread* can work correctly.
}
bằng cách sử dụng passed by value
, cấu trúc bộ đệm mới được truyền vào khác với biến bộ đệm gốc.