"বাইটস.বাফার প্রাপ্তি io.Writer প্রয়োগ করে না" ত্রুটি বার্তাটি


101

আমি কয়েকটি 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)

আমি বিভ্রান্ত, যেহেতু এটি স্পষ্টভাবে ইন্টারফেসটি প্রয়োগ করে। আমি কীভাবে এই ত্রুটিটি সমাধান করব?


4
আমি কমপক্ষে দু'বার এই সমস্যার মুখোমুখি হয়েছি এবং এর সমাধানের জন্য গুগলিং সত্যিই অসহনীয় ছিল।
কেভিন বার্ক

11
মনে রাখবেন যে বুফিও তৈরির প্রয়োজন নেই। শুধু ব্যবহার & B হিসাবে একটি io.Writer
Vivien

উত্তর:


156

বাফারের পরিবর্তে বাফারে একটি পয়েন্টার দিন:

import "bufio"
import "bytes"

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

4
আমি এটিতে ছুটে এসেছি এবং কেন এটি কেন তা শিখতে আগ্রহী। আমি গো এর পয়েন্টারগুলির সাথে বেশ অপরিচিত।
ঘন্টাব্যাক

4
ধন্যবাদ কেভিন, এই সাধারণ ভুলটি আমার এক ঘন্টা সময় নিয়েছে যতক্ষণ না আমি এটিকে গুগল করি। :)
নেলো মিত্রানিম

8
@ হুরব্যাকটি ইন্টারফেসটি যেভাবে প্রয়োগ করা হয়েছে তার সাথে এটি করতে হবে। গো-তে একটি ইন্টারফেস বাস্তবায়নের উপায় রয়েছে। হয় মান বা পয়েন্টার রিসিভার সহ। আমি মনে করি এটি যেতে সত্যিই অদ্ভুত মোচড়। ইন্টারফেসটি যদি কোনওভাবে মান রিসিভারগুলি ব্যবহার করে প্রয়োগ করা হয় তবে ঠিক আছে তবে পয়েন্টার রিসিভারগুলি ব্যবহার করে যদি ইন্টারফেসটি প্রয়োগ করা হয় তবে আপনি যদি ইন্টারফেসটি ব্যবহার করতে চান তবে আপনাকে মানটিতে একটি পয়েন্টার দিতে হবে। এটি লেখক যেদিকে শীর্ষস্থানীয় তা ট্র্যাক রাখতে লেখককে বাফারকে পরিবর্তন করতে হবে বলে এটি বোঝা যায়।
জন লিডেগ্রেন

24
package main

import "bytes"
import "io"

func main() {
    var b bytes.Buffer
    _ = io.Writer(&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, যদি আমরা পাস bকরতে buffio.NewWriter(), 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, পাস করা নতুন বাফার স্ট্রাক্ট মূল বাফার ভেরিয়েবলের থেকে পৃথক।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.