일부 Go 개체가 io.Writer를 구현하도록 시도하고 있지만 파일이나 파일과 같은 개체 대신 문자열에 씁니다. 나는 bytes.Buffer
그것이 구현하기 때문에 작동 할 것이라고 생각했다 Write(p []byte)
. 그러나 이것을 시도 할 때 :
import "bufio"
import "bytes"
func main() {
var b bytes.Buffer
foo := bufio.NewWriter(b)
}
다음과 같은 오류가 발생합니다.
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)
인터페이스를 명확하게 구현하기 때문에 혼란 스럽습니다. 이 오류를 어떻게 해결합니까?
답변
버퍼 자체 대신 포인터를 버퍼에 전달합니다.
import "bufio"
import "bytes"
func main() {
var b bytes.Buffer
foo := bufio.NewWriter(&b)
}
답변
package main
import "bytes"
import "io"
func main() {
var b bytes.Buffer
_ = io.Writer(&b)
}
io.Writer를 만들기 위해 “bufio.NewWriter (& b)”를 사용할 필요가 없습니다. & b는 io.Writer 자체입니다.
답변
그냥 사용
foo := bufio.NewWriter(&b)
bytes.Buffer가 io.Writer를 구현하는 방식은
func (b *Buffer) Write(p []byte) (n int, err error) {
...
}
// io.Writer definition
type Writer interface {
Write(p []byte) (n int, err error)
}
그것은이다 b *Buffer
,하지 b Buffer
. (또한 변수 나 포인터로 메서드를 호출 할 수 있다는 점이 이상하다고 생각하지만 포인터를 비 포인터 유형 변수에 할당 할 수는 없습니다.)
게다가 컴파일러 프롬프트가 명확하지 않습니다.
bytes.Buffer does not implement io.Writer (Write method has pointer receiver)
일부 아이디어는 이동 사용은 Passed by value
우리가 통과하는 경우 b
에 buffio.NewWriter()
, NewWriter ()에, 그것은 새로운 b
그러므로 우리는 주소를 전달할 필요, (새로운 버퍼),하지 우리가 정의 된 원래 버퍼 &b
.
다시 추가하면 bytes.Buffer가 정의됩니다.
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.
}
를 사용 passed by value
하면 전달 된 새 버퍼 구조체가 원본 버퍼 변수와 다릅니다.