"बाइट्स। बफ़र io.Writer को लागू नहीं करता" त्रुटि संदेश


98

मैं कुछ गो ऑब्जेक्ट को 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)

मैं उलझन में हूं, क्योंकि यह स्पष्ट रूप से इंटरफ़ेस को लागू करता है। मैं इस त्रुटि को कैसे हल करूं?


2
मैं इस समस्या में कम से कम दो बार भाग चुका हूं, और एक समाधान के लिए Googling वास्तव में अनहेल्दी था।
केविन बर्क

11
ध्यान दें कि bufio का निर्माण आवश्यक नहीं है। बस io.Writer के रूप में उपयोग करें & b
विवियन

जवाबों:


153

बफ़र को इंगित करने के लिए बफ़र के बजाय स्वयं एक सूचक पास करें:

import "bufio"
import "bytes"

func main() {
    var b bytes.Buffer
    foo := bufio.NewWriter(&b)
}

4
मैं इसमें भाग गया और सीखने में दिलचस्पी होगी कि ऐसा क्यों है। मैं जाने में संकेत के साथ बहुत अपरिचित हूँ।
घंटेबैक

1
धन्यवाद केविन, यह सरल गलती मेरे समय का एक घंटा लेती थी जब तक कि मैंने इस पर ध्यान नहीं दिया। :)
नीलो मित्राणिम

7
@ इसे इंटरफ़ेस को लागू करने के तरीके के साथ करना है। गो में एक इंटरफ़ेस लागू करने के तरीके वास्तव में हैं। या तो मूल्य या सूचक रिसीवर के साथ। मुझे लगता है कि यह गो के लिए वास्तव में अजीबोगरीब मोड़ है। यदि इंटरफ़ेस को रिसीव किया जाता है तो वैल्यू रिसीवर्स का उपयोग किया जाता है। यदि आप इंटरफ़ेस रिसीवर्स का उपयोग कर रहे हैं, तो यदि आप इंटरफ़ेस का उपयोग करने का इरादा रखते हैं, तो पॉइंटर रिसीवर का उपयोग करके इंटरफ़ेस को लागू किया जाता है। यह समझ में आता है क्योंकि लेखक को यह ट्रैक करने के लिए बफर को म्यूट करना पड़ता है कि यह लेखक का सिर कहां है।
जॉन लीडग्रेन 7

23
package main

import "bytes"
import "io"

func main() {
    var b bytes.Buffer
    _ = io.Writer(&b)
}

आपको io.Writer बनाने के लिए "bufio.NewWriter (& b)" का उपयोग करने की आवश्यकता नहीं है। & b एक io.Writer ही है।


यह सही उत्तर होना चाहिए। यदि आप बफर से एक नया लेखक बनाने की कोशिश करते हैं, तो आप बफर बाइट को सीधे लाने में सक्षम नहीं होंगे, जिससे चीजें बहुत अधिक जटिल हो जाती हैं।
onetwopunch

8

महज प्रयोग करें

foo := bufio.NewWriter(&b)

क्योंकि जिस तरह से बाइट करता है। बफ़र 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, यदि हम NewWriter () में पास bहोते हैं buffio.NewWriter(), तो यह एक नया हैb (नया बफर) है, न कि हमने जो मूल बफर परिभाषित किया है, इसलिए हमें पता पास करने की आवश्यकता है &b

फिर से जोड़ें, बाइट्स। बफ़र को परिभाषित किया गया है:

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, पारित नए बफर संरचना मूल बफर चर से अलग है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.