[go] “bytes.Buffer가 io.Writer를 구현하지 않습니다”오류 메시지가 표시됨

일부 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우리가 통과하는 경우 bbuffio.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하면 전달 된 새 버퍼 구조체가 원본 버퍼 변수와 다릅니다.


답변